📅  最后修改于: 2023-12-03 15:13:51.925000             🧑  作者: Mango
在许多情况下,我们需要在C#中序列化对象,以便我们可以将它们存储到磁盘或通过网络发送。然而,并不是所有类型的对象都可以被序列化。尝试对不可序列化的对象进行序列化操作,会导致运行时异常。
可序列化的对象具有一个与之相关联的类型,该类型实现了[System.Serializable]或[DataContract]属性。这些属性告诉C#编译器和序列化器对象可以被序列化。例如,以下类是可序列化的:
[Serializable]
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
如前所述,要将一个对象标记为可序列化,需要在它的类前面添加[Serializable]或[DataContract]属性。例如:
[Serializable]
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
如果我们希望使用[DataContract]而不是[Serializable],这个类将会看起来不同:
[DataContract]
public class Person
{
[DataMember]
public string Name { get; set; }
[DataMember]
public int Age { get; set; }
}
如果我们尝试序列化一个未标记为可序列化的对象,将会看到一个运行时异常:
Person person = new Person { Name = "Tom", Age = 30 };
IFormatter formatter = new BinaryFormatter();
MemoryStream stream = new MemoryStream();
formatter.Serialize(stream, person); // 这里会抛出异常
要解决这个问题,我们需要对我们要序列化的对象进行标记。
您可以按Ctrl + Shift + B,在Visual Studio的输出窗口中查找以下内容:
1>------ Rebuild All started: Project: MyProject, Configuration: Debug Any CPU ------
...
n>Label not marked as serializable: MyProject.MyClass
如果您看到这行消息,就可以知道该类不能被序列化。或者,您可以在C#中使用如下代码:
if (!typeof(MyClass).IsSerializable)
{
// MyClass是不可序列化的
}
在C#中,只有被标记为可序列化的对象才可以被序列化。如果您尝试序列化一个未标记为可序列化的对象,将会抛出一个运行时异常。要使一个类可序列化,您需要在它的类定义前面加上[Serializable]或[DataContract]属性,并在需要序列化的成员前面加上[DataMember]属性。