c# - 在 C# 中处理序列化异常

标签 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."

我该如何解决这个问题?

最佳答案

使用 BinaryFormatter,您可以通过将字段标记为 [NonSerialized]排除该字段,但这样您将得不到数据。您可以使用自定义序列化 (ISerializable),但这很难。

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

关于c# - 在 C# 中处理序列化异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1497659/

相关文章:

c# - 使用十进制值作为十六进制值

c# - 如何删除文件、主文件夹和子文件夹

.net - 是否可以用使用不同 key 签名的程序集来替换强名称程序集?

java - 将 java 对象序列化为 objective-c plist

Java:ObjectOutputStream 存在可序列化问题

android - 如何使用 Retrofit/Gson 反序列化 JSON 中相同类型但字段名称不同的对象列表?

c# - 传递一个类型参数并声明一个列表

c# - 什么是白标 dll 的好方法

c# - asp.net MVC路由错误404

.net - 使用 WebBrowser .NET 控件放大网页