看到您可以将任何文档转换为字节数组并将其保存到磁盘,然后将文件重建为其原始形式(只要您有其文件名的元数据等)。
为什么你必须用[Serializable]
etc 标记一个类?这只是同样的想法,“元数据”类型信息,所以当你将对象转换为它的类时,事情会正确映射吗?
看到您可以将任何文档转换为字节数组并将其保存到磁盘,然后将文件重建为其原始形式(只要您有其文件名的元数据等)。
为什么你必须用[Serializable]
etc 标记一个类?这只是同样的想法,“元数据”类型信息,所以当你将对象转换为它的类时,事情会正确映射吗?
二进制序列化非常强大,它可以在不运行构造函数的情况下创建类的实例,并且可以在您声明为私有的类中设置字段。常规代码当然不能这样做。通过应用 [Serializable] 属性,您明确允许它处理您的私人部分。而且您隐含地将该权限仅授予 BinaryFormatter 类。
XML序列化不需要这种ok,它只序列化公开的成员。
DataContractSerializer 也可以序列化私有成员。因此它需要再次明确地确定,现在使用 [DataContract] 属性。
首先,您不必这样做。
它只是一个标记接口,告诉序列化程序该类由它可以序列化的项目组成(可能是也可能不是真的)并且可以使用默认序列化。
具有XMLSerializer
附加要求,即该类具有零参数构造函数。
还有其他使用序列化合同的序列化程序(例如DataContractSerializer
) - 它们使您可以更好地控制序列化,而不是简单地将类标记为Serializable
. 您还可以通过实现ISerializable
接口来获得更多控制权。
它向序列化程序指示您希望该类被序列化,因为您可能不希望所有属性或类都被序列化。
它基本上是指示一个类可以序列化的元数据,仅此而已。
许多框架序列化程序都需要它,它们拒绝处理没有应用此属性的类型。
序列化会产生安全漏洞,并且可能会受到版本问题的困扰。最重要的是,对于某些类,序列化的想法完全是胡说八道。
有关详细信息,请参阅为什么 Java 需要 Serializable 接口?,尤其是这个,这个,还有这个。他们认为序列化应该是您必须明确选择加入的功能。
作为对立面,该问题的公认答案表明类默认情况下应该是可序列化的。
我认为这是一个提醒,我将允许对课程进行序列化。所以你不会隐式序列化你不应该的东西。
不知道这是设计师的意图。
BTW, I just love BinaryFormatter
and use it as much as I can. It handles pretty much of the stuff automatically (like rebuilding complex object graphs with recurring references spread throughout the graph).