在C#中处理SerializationExceptions

时间:2009-09-30 11:51:47

标签: c# .net serialization

我在以下代码中收到SerializationException: (...) is not marked as serializable.错误:

[Serializable]
public class Wind
{
    public MyText text;
    public Size MSize;
    public Point MLocation;
    public int MNumber;

    /.../
}

[Serializable]
public class MyText 
{
    public string MString;
    public Font MFont;
    public StringFormat StrFormat;
    public float MySize;
    public Color FColor, SColor, TColor;
    public bool IsRequest;
    public decimal MWide;

    /.../
}

和要序列化的列表:

 List<Wind> MyList = new List<Wind>();

代码段:

 FileStream FS = new FileStream(AppDomain.CurrentDomain.BaseDirectory + 
                                "Sticks.dat", FileMode.Create);
 BinaryFormatter BF = new BinaryFormatter();

 BF.Serialize(FS, MyList);  
 FS.Close();

抛出异常:

System.Runtime.Serialization.SerializationException was unhandled
  Message="Type 'System.Drawing.StringFormat' in Assembly 'System.Drawing,   
Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' is not 
marked as serializable."

如何解决这个问题?

3 个答案:

答案 0 :(得分:5)

使用BinaryFormatter,您可以通过标记[NonSerialized]排除字段,但之后您将无法获取数据。您可以使用自定义序列化(ISerializable),但这很难。

就个人而言,我会使用不同的序列化器;特别是DataContractSerializer或protobuf-net,其中任何一个都允许你创建一个第二个属性用于序列化,编写你自己的代码来表示它更简单(一个字符串,也许)。

答案 1 :(得分:2)

通过应用[NotSerialized]属性,可以将任何无法序列化的项目标记为不可序列化。这确实意味着您必须显式重新创建类型,而不是依赖序列化器重新创建它。

答案 2 :(得分:0)

看起来你必须扮演你自己的序列化形式角色,或者将类封装在可以序列化的东西中。如果你创建一个隐式演员表,你的班级用户在某些情况下甚至都不会注意到......

要使您的类按原样序列化,您必须将NonSerialized属性添加到StrFormat属性。