为什么必须用属性标记一个类?

看到您可以将任何文档转换为字节数组并将其保存到磁盘,然后将文件重建为其原始格式(只要您的文件名包含元数据等)。

你为什么要用[Serializable]等标记一个类? 这是一个相同的想法,“元数据”类型信息,所以当你将对象转换为它的类时,事物是否正确映射?

首先,你不必。

它只是一个标记接口 ,它告诉序列化程序该类由可以序列化的项(可能是也可能不是)组成,并且可以使用默认序列化。

XMLSerializer还需要为类提供零参数构造函数。

还有其他使用契约进行序列化的序列化程序(例如DataContractSerializer ) – 它们使您可以更好地控制序列化,而不仅仅是将类标记为Serializable 。 您还可以通过实现ISerializable接口获得更多控制权。

二进制序列化非常强大,它可以在不运行构造函数的情况下创建类的实例,并且可以在类中设置您声明为private的字段。 常规代码当然不能这样做。 通过应用[Serializable]属性,您可以明确地让它变得混乱您的私有部分。 并且您隐式将该权限仅授予BinaryFormatter类。

XML序列化不需要这种方式,它只序列化公共成员。

DataContractSerializer也可以序列化私有成员。 因此,现在需要一个明确的好处,现在使用[DataContract]属性。

它基本上是元数据,表明类可以序列化,仅此而已。

它是许多框架序列化程序所必需的,它们拒绝处理没有应用此属性的类型。

序列化可能会产生安全漏洞,并可能受到版本问题的困扰。 最重要的是,对于某些类而言,序列化的想法完全是胡说八道。

有关详细信息,请参阅为什么Java需要Serializable接口的优秀答案? 特别是这一个 , 这一个 ,还有这一个 。 他们认为序列化应该是您必须明确选择的function。

对于一个对应点,该问题的接受答案表明类默认情况下应该可序列化。

它向序列化程序指示您希望序列化该类,因为您可能不希望序列化所有属性或类。

我认为这是一个提示,我将允许该类序列化。 因此,您不要隐式序列化您不应该的内容。

不知道这是设计师的意图。

顺便说一句,我只是喜欢BinaryFormatter并尽可能多地使用它。 它可以自动处理大部分内容(例如重建复杂的对象图,其中重复的引用遍布整个图形)。