在 Windows 窗体、.NET Framework 4.0 中,我正在尝试序列化我编写的类的实例。
该类被标记为可序列化,但使用该类的表单(显然)不是。
我不想序列化表单的实例。我想序列化我在类里面的数据。
我类中的所有内容都标记为可序列化,那么为什么我仍然收到 SerializationException?
(点击>> HERE << 在新窗口中打开全尺寸图片)
更新:
这是我的 BrazierCuttoff 类和相关部分:
[Serializable()]
public class BrazierCuttoff : IEquatable<BrazierCuttoff> {
private int qty;
private int[] joint, pass, shift;
private float mult;
private BrazierPay a, b, c, d, e;
public event EventHandler BrazierCuttoffChanged;
public const int MAXIMUMSMALLQUANTITY = 20;
EnumeratedLevel[,] eLvArray;
/// <summary>
/// Gets or Sets the Brazier Matrix values
/// </summary>
/// <param name="passRatioIndex">0=100%,1=95,2=90,3=85,4=80,5=75,6=70,7=65</param>
/// <param name="minJointIndex">0=900,1=1200,2=1400,3=1600,4=1800,5=2000,6=2100,=2200</param>
/// <returns>Brazier Matrix value</returns>
public EnumeratedLevel this[int passRatioIndex, int minJointIndex] {
get { return eLvArray[passRatioIndex, minJointIndex]; }
set { eLvArray[passRatioIndex, minJointIndex] = value; }
}
/// <summary>
/// Initializes a new Form Values object using default values
/// </summary>
public BrazierCuttoff() {
A = new BrazierPay(5.0f);
B = new BrazierPay(4.0f);
C = new BrazierPay(3.0f);
D = new BrazierPay(2.0f);
E = new BrazierPay(1.0f);
NA = new BrazierPay(0.0f);
ShiftMinimum = new int[] { 12, 12, 12 };
PassRatio = new int[] { 100, 95, 90, 85, 80, 75, 70, 65 };
JointMinimum = new int[] { 900, 1200, 1400, 1600, 1800, 2000, 2100, 2200 };
eLvArray = new EnumeratedLevel[8, 8];
EnumeratedLevel level = EnumeratedLevel.NA_Silver;
for (int y = 0; y < 8; y++) {
for (int x = 0; x < 8; x++) {
switch (y) {
case 0: level = (x < 2) ? EnumeratedLevel.B_Blue : EnumeratedLevel.A_Violet; break;
case 1: level = (x == 0) ? EnumeratedLevel.C_Green : (x < 3) ? EnumeratedLevel.B_Blue : EnumeratedLevel.A_Violet; break;
case 2: level = (x < 2) ? EnumeratedLevel.C_Green : (x < 5) ? EnumeratedLevel.B_Blue : EnumeratedLevel.A_Violet; break;
case 3: level = (x == 0) ? EnumeratedLevel.D_Yellow : (x < 4) ? EnumeratedLevel.C_Green : (x < 6) ? EnumeratedLevel.B_Blue : EnumeratedLevel.A_Violet; break;
case 4: level = (x < 2) ? EnumeratedLevel.D_Yellow : (x < 5) ? EnumeratedLevel.C_Green : EnumeratedLevel.B_Blue; break;
case 5: level = (x == 0) ? EnumeratedLevel.E_Orange : (x < 3) ? EnumeratedLevel.D_Yellow : (x < 6) ? EnumeratedLevel.C_Green : EnumeratedLevel.B_Blue; break;
case 6: level = (x < 2) ? EnumeratedLevel.E_Orange : (x < 5) ? EnumeratedLevel.D_Yellow : EnumeratedLevel.C_Green; break;
default: level = (x == 0) ? EnumeratedLevel.NA_Silver : (x < 5) ? EnumeratedLevel.E_Orange : EnumeratedLevel.D_Yellow; break;
}
eLvArray[x, y] = level;
}
}
}
private void broadcast() {
if (BrazierCuttoffChanged != null) {
BrazierCuttoffChanged(this, new EventArgs());
}
}
/// <summary>
/// Gets or Sets the A Pay Level data
/// </summary>
public BrazierPay A { get { return a; } set { if (a != value) { a = value; broadcast(); } } }
/// <summary>
/// Gets or Sets the B Pay Level data
/// </summary>
public BrazierPay B { get { return b; } set { if (b != value) { b = value; broadcast(); } } }
/// <summary>
/// Gets or Sets the C Pay Level data
/// </summary>
public BrazierPay C { get { return c; } set { if (c != value) { c = value; broadcast(); } } }
/// <summary>
/// Gets or Sets the D Pay Level data
/// </summary>
public BrazierPay D { get { return d; } set { if (d != value) { d = value; broadcast(); } } }
/// <summary>
/// Gets or Sets the E Pay Level data
/// </summary>
public BrazierPay E { get { return e; } set { if (e != value) { e = value; broadcast(); } } }
/// <summary>
/// Gets or Sets the N/A Pay Level data
/// </summary>
public BrazierPay NA { get; private set; }
public void Refresh() {
const float delta = 0.01f;
while (A.Dirty || B.Dirty || C.Dirty || D.Dirty || E.Dirty) {
if (A.Dirty) {
if (A.Value <= B.Value) B.Value = A.Value - delta;
A.Dirty = false;
} else if (B.Dirty) {
if (B.Value <= C.Value) C.Value = B.Value - delta;
if (A.Value <= B.Value) A.Value = B.Value + delta;
B.Dirty = false;
} else if (C.Dirty) {
if (C.Value <= D.Value) D.Value = C.Value - delta;
if (B.Value <= C.Value) B.Value = C.Value + delta;
C.Dirty = false;
} else if (D.Dirty) {
if (D.Value <= E.Value) E.Value = D.Value - delta;
if (C.Value <= D.Value) C.Value = D.Value + delta;
D.Dirty = false;
} else if (E.Dirty) {
if (D.Value <= E.Value) D.Value = E.Value + delta;
E.Dirty = false;
}
}
}
/// <summary>
/// Gets the minimum Average Joints requirement
/// </summary>
public int AverageJoints { get { return JointMinimum[0]; } }
/// <summary>
/// Gets the minimum Chamber Pass Ratio requirement
/// </summary>
public int FirstTimePassRate { get { return PassRatio[PassRatio.Length - 1]; } }
/// <summary>
/// Gets or sets the Minimum Average Joints requirements (Range: 0 @ 900 to 7 @ 2200)
/// </summary>
public int[] JointMinimum { get { return joint; } set { if (joint != value) { joint = value; broadcast(); } } }
/// <summary>
/// Gets or Sets the Chamber Pass Ratio levels (Range: 0 @ 100% to 7 @ 65%)
/// </summary>
public int[] PassRatio { get { return pass; } set { if (pass != value) { pass = value; broadcast(); } } }
/// <summary>
/// Gets or Sets the Integral Array of minimum shifts required to qualify for a bonus
/// </summary>
public int[] ShiftMinimum { get { return shift; } set { if (shift != value) { shift = value; broadcast(); } } }
/// <summary>
/// Gets or Sets the Small Workorder Multiplier (1 is default/disable)
/// </summary>
public float SmallWoMulti { get { return mult; } set { if (mult != value) { mult = value; broadcast(); } } }
/// <summary>
/// Gets or Sets the Small Workorder Quantity value (0 is disable)
/// </summary>
public int SmallWoQty { get { return qty; } set { if (qty != value) { qty = value; broadcast(); } } }
#region IEquatable<BrazierCuttoff> Members
public bool Equals(BrazierCuttoff other) {
if (other != null) {
if ((A == other.A) && (B == other.B) && (C == other.C) && (D == other.D) && (E == other.E) && (NA == other.NA)) {
if ((ShiftMinimum == other.ShiftMinimum) && (PassRatio == other.PassRatio) && (JointMinimum == other.JointMinimum)) {
return (eLvArray == other.eLvArray);
}
}
}
return false;
}
#endregion
}
这是在上面的类中使用的 BrazierPay 对象:
[Serializable()]
public class BrazierPay {
float pay;
public BrazierPay(float payLevel) {
Dirty = false;
pay = payLevel;
}
public float Value {
get { return pay; }
set {
if (pay != value) {
Dirty = true;
pay = value;
}
}
}
public bool Dirty { get; set; }
public string DollarValue { get { return string.Format("{0:C}", pay); } }
public string Formatted { get { return string.Format("{0:F}", pay); } }
public override string ToString() { return Formatted; }
}
我什至将这个枚举类型标记为可序列化(尽管它不需要它):
[Serializable()]
public enum EnumeratedLevel {
NA_Silver = Clicker.NA_Silver, // Color.Silver
E_Orange = Clicker.E_Orange, // Color.Orange
D_Yellow = Clicker.D_Yellow, // Color.Yellow
C_Green = Clicker.C_Green, // Color.Lime
B_Blue = Clicker.B_Blue, // Color.DodgerBlue
A_Violet = Clicker.A_Violet, // Color.Violet
}
最佳答案
我需要设置一个 NonSerializedAttribute对于 EventHandler。
事件委托(delegate)无法在类中序列化(请参阅 Delegates and Serialization)。
将字段标记为 NonSerializedAttribute听起来很简单。
在我的代码中,我只是添加了这一行:
[field:NonSerializedAttribute()]
public event EventHandler BrazierCuttoffChanged;
关于c# - SerializationException 类型 "is not marked as serializable"- 但它是,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11507819/
我正在尝试测试是否存在表单。我是Rails新手。我的new.html.erb_spec.rb文件的内容是:require'spec_helper'describe"messages/new.html.erb"doit"shouldrendertheform"dorender'/messages/new.html.erb'reponse.shouldhave_form_putting_to(@message)with_submit_buttonendendView本身,new.html.erb,有代码:当我运行rspec时,它失败了:1)messages/new.html.erbshou
我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-
我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t
为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar
我可以得到Infinity和NaNn=9.0/0#=>Infinityn.class#=>Floatm=0/0.0#=>NaNm.class#=>Float但是当我想直接访问Infinity或NaN时:Infinity#=>uninitializedconstantInfinity(NameError)NaN#=>uninitializedconstantNaN(NameError)什么是Infinity和NaN?它们是对象、关键字还是其他东西? 最佳答案 您看到打印为Infinity和NaN的只是Float类的两个特殊实例的字符串
我不确定传递给方法的对象的类型是否正确。我可能会将一个字符串传递给一个只能处理整数的函数。某种运行时保证怎么样?我看不到比以下更好的选择:defsomeFixNumMangler(input)raise"wrongtype:integerrequired"unlessinput.class==FixNumother_stuffend有更好的选择吗? 最佳答案 使用Kernel#Integer在使用之前转换输入的方法。当无法以任何合理的方式将输入转换为整数时,它将引发ArgumentError。defmy_method(number)
我遵循MichaelHartl的“RubyonRails教程:学习Web开发”,并创建了检查用户名和电子邮件长度有效性的测试(名称最多50个字符,电子邮件最多255个字符)。test/helpers/application_helper_test.rb的内容是:require'test_helper'classApplicationHelperTest在运行bundleexecraketest时,所有测试都通过了,但我看到以下消息在最后被标记为错误:ERROR["test_full_title_helper",ApplicationHelperTest,1.820016791]test
我正在尝试从Postgresql表(table1)中获取数据,该表由另一个相关表(property)的字段(table2)过滤。在纯SQL中,我会这样编写查询:SELECT*FROMtable1JOINtable2USING(table2_id)WHEREtable2.propertyLIKE'query%'这工作正常:scope:my_scope,->(query){includes(:table2).where("table2.property":query)}但我真正需要的是使用LIKE运算符进行过滤,而不是严格相等。然而,这是行不通的:scope:my_scope,->(que
我正在尝试编写一个将文件上传到AWS并公开该文件的Ruby脚本。我做了以下事情:s3=Aws::S3::Resource.new(credentials:Aws::Credentials.new(KEY,SECRET),region:'us-west-2')obj=s3.bucket('stg-db').object('key')obj.upload_file(filename)这似乎工作正常,除了该文件不是公开可用的,而且我无法获得它的公共(public)URL。但是当我登录到S3时,我可以正常查看我的文件。为了使其公开可用,我将最后一行更改为obj.upload_file(file
当我尝试安装Ruby时遇到此错误。我试过查看this和this但无济于事➜~brewinstallrubyWarning:YouareusingOSX10.12.Wedonotprovidesupportforthispre-releaseversion.Youmayencounterbuildfailuresorotherbreakages.Pleasecreatepull-requestsinsteadoffilingissues.==>Installingdependenciesforruby:readline,libyaml,makedepend==>Installingrub