简体   繁体   English

SerializationException类型“未标记为可序列化” - 但它确实如此

[英]SerializationException Type “is not marked as serializable” - But it is

In Windows Forms, .NET Framework 4.0, I am trying to Serialize an instance of a class I wrote. 在Windows窗体,.NET Framework 4.0中,我正在尝试序列化我编写的类的实例。

The class is marked as Serializable, but the form that uses the class (obviously) is not. 该类被标记为Serializable,但使用该类(显然)的形式不是。

I do not want to Serialize an instance of the form. 我不想序列化表单的实例。 I want to Serialize the data I have in my class. 我想序列化我班上的数据。

Everything in my class is marked as Serializable, so why am I still getting the SerializationException? 我班上的所有东西都标记为Serializable,为什么我仍然得到SerializationException?

SerializationException.png

(Click >> HERE << to open image full-size in a new window) (点击>>这里<<在新窗口中打开图片全尺寸)

Update: 更新:

Here is my BrazierCuttoff class and related parts: 这是我的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

}

This is the BrazierPay object that is used in the class above: 这是上面类中使用的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; }
}

I even marked this enumerated type as Serializable (though, it should not need it): 我甚至将这个枚举类型标记为Serializable(但是,它不应该需要它):

[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
}

Resolved 解决

I needed to set a NonSerializedAttribute for the EventHandler . 我需要为EventHandler设置NonSerializedAttribute

The event delegate could not be serialized in the class (see Delegates and Serialization ). 无法在类中序列化事件委托(请参阅委托和序列化 )。

Marking the field as NonSerializedAttribute was as easy as it sounds. 将字段标记为NonSerializedAttribute就像听起来一样简单。

From my code, I simply added this line: 从我的代码中,我只是添加了这一行:

[field:NonSerializedAttribute()]
public event EventHandler BrazierCuttoffChanged;

This is something you can run into with any JSON serialization, including Web API in MVC 4. 这是您可以在任何JSON序列化中遇到的问题,包括MVC 4中的Web API。

I found this post to be very helpful when I was getting a serialization except on a const int value. 我发现这篇文章在我获得序列化时非常有用,除了const int值。 Any const value needs to be marked with the same attribute as in Nick Freeman's answer: 任何const值都需要用与Nick Freeman的答案相同的属性标记:

[field: NonSerializedAttribute]
const int iCantBeSerialized = 1;
[field:NonSerializedAttribute()]
public event EventHandler BrazierCuttoffChanged;

Had the same problem, the PropertyChanged EventHandler of my serializable NotifyObject base class was subscribed by some viewmodels which went into the serialization queue therefore. 有同样的问题,我的可序列化NotifyObject基类的PropertyChanged EventHandler由一些进入序列化队列的viewmodels订阅。 Adding the NonSerializedAddtribute to this EventHandler saved my day. 将NonSerializedAddtribute添加到此EventHandler节省了我的一天。 :-) :-)

BrazierMatrix2标记为[Serializable]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 &lt;&lt; SerializationException: Type 'UnityEngine.MonoBehaviour' ...未标记为可序列化&gt;&gt;? - << SerializationException : Type 'UnityEngine.MonoBehaviour' … is not marked as serializable >>? SerializationException:类型UnityEngine.GameObject未标记为Serializable - SerializationException: Type UnityEngine.GameObject is not marked as Serializable 尝试序列化Dictionary时,SerializationException“未标记为可序列化” - SerializationException “is not marked as serializable” when trying to serialize a Dictionary 正在获取SerializationException:&#39;&lt;&gt; f__AnonymousType2`未标记为可序列化 - Getting SerializationException : '<>f__AnonymousType2` is not marked as serializable SerializationException:当我尝试序列化ObservableCollection时,出现“ Type \\…\\ Assembly \\…\\中未标记为可序列化” - SerializationException: “Type\…\ in assembly\…\ is not marked as serializable” appears when I try to serialize ObservableCollection 程序集中的类型未标记为可序列化 - Type in assembly is not marked as serializable 调试器Visualizer和“类型未标记为可序列化” - Debugger Visualizer and “Type is not marked as serializable” AppDomain CreateInstanceAndUnwrap:类型未标记为可序列化 - AppDomain CreateInstanceAndUnwrap: Type is not marked as serializable 汇编中的类型未标记为可序列化的 Unity - Type in assembly is not marked as serializable Unity 类序列化期间发生错误:类型未标记为可序列化 - Error during class serialization: type is not marked serializable
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM