C#报”SerializationException”的原因以及解决办法

  • Post category:C#

SerializationException是.NET Framework中的异常类型之一,表示在序列化和反序列化过程中出现错误。它通常是由于以下原因之一引起的:

  1. 类没有进行序列化标记:当要序列化和反序列化一个对象时,它必须标记为[Serializable]。如果类没有标记,它就不能进行序列化和反序列化操作,否则就会抛出SerializationException。

解决方法:将类标记为[Serializable],如下所示:

[Serializable]
public class MyClass
{
    // class definition here
}
  1. 类中的某个非序列化的成员变量:当类中包含一个非序列化的成员变量时,在序列化过程中就会导致SerializationException异常。

解决方法:将非序列化的成员变量标记为[NonSerialized],如下所示:

[Serializable]
public class MyClass
{
    public string Name;

    [NonSerialized]
    public int Age;
}

示例1:

例如,以下代码段定义了一个未标记为可序列化的类:

class MyClass
{
    public string Name;
    public int Age;
}

那么,当我们尝试将一个MyClass对象写入一个文件中时,就会抛出SerializationException异常。

MyClass obj = new MyClass { Name = "John", Age = 30 };
BinaryFormatter formatter = new BinaryFormatter();

using (Stream stream = new FileStream("file.bin", FileMode.Create, FileAccess.Write))
{
    formatter.Serialize(stream, obj); // 抛出SerializationException
}

为了解决这个问题,我们需要在类定义中添加[Serializable]标记:

[Serializable]
class MyClass
{
    public string Name;
    public int Age;
}

示例2:

以下是另一个导致SerializationException异常的示例:在将对象反序列化之前,已更改了对象的类结构。例如,我们已经添加了一个新的成员变量,而没有更新序列化结果中的内容。

[Serializable]
class MyClass
{
    public string Name;
    public int Age;
}

// 创建一个对象并序列化它
MyClass obj = new MyClass { Name = "John", Age = 30 };
BinaryFormatter formatter = new BinaryFormatter();

using (Stream stream = new FileStream("file.bin", FileMode.Create, FileAccess.Write))
{
    formatter.Serialize(stream, obj);
}

// 更改类结构
[Serializable]
class MyClass
{
    public string Name;
    public int Age;
    public string Address; // 新的成员变量
}

// 尝试反序列化对象
using (Stream stream = new FileStream("file.bin", FileMode.Open, FileAccess.Read))
{
    MyClass newObj = (MyClass)formatter.Deserialize(stream); // 抛出SerializationException
}

为了解决这个问题,我们需要在更改类结构之后创建一个新的类,而不是直接更改原始类结构:

[Serializable]
class MyClassV2
{
    public string Name;
    public int Age;
    public string Address;
}

// 尝试反序列化对象
using (Stream stream = new FileStream("file.bin", FileMode.Open, FileAccess.Read))
{
    MyClassV2 newObj = (MyClassV2)formatter.Deserialize(stream);
}

总之,要解决SerializationException异常,开发人员需要仔细检查类定义中是否包含[Serializable]和[NonSerialized]属性,以及在运行时是否更新了类定义。