📜  c# 未标记为可序列化 - C# (1)

📅  最后修改于: 2023-12-03 15:13:51.925000             🧑  作者: Mango

C# 未标记为可序列化

在许多情况下,我们需要在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]属性。