17

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

为什么你必须用[Serializable]etc 标记一个类?这只是同样的想法,“元数据”类型信息,所以当你将对象转换为它的类时,事情会正确映射吗?

4

6 回答 6

27

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

XML序列化不需要这种ok,它只序列化公开的成员。

DataContractSerializer 也可以序列化私有成员。因此它需要再次明确地确定,现在使用 [DataContract] 属性。

于 2010-04-07T19:14:07.827 回答
18

首先,您不必这样

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

具有XMLSerializer附加要求,即该类具有零参数构造函数。

还有其他使用序列化合同的序列化程序(例如DataContractSerializer) - 它们使您可以更好地控制序列化,而不是简单地将类标记为Serializable. 您还可以通过实现ISerializable接口来获得更多控制权。

于 2010-04-07T19:01:02.363 回答
2

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

于 2010-04-07T18:59:17.767 回答
2

它基本上是指示一个类可以序列化的元数据,仅此而已。

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

于 2010-04-07T19:11:09.750 回答
2

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

有关详细信息,请参阅为什么 Java 需要 Serializable 接口?,尤其是这个这个,还有这个。他们认为序列化应该是您必须明确选择加入的功能。

作为对立面,该问题的公认答案表明类默认情况下应该是可序列化的。

于 2010-04-07T19:11:56.990 回答
0

我认为这是一个提醒,我将允许对课程进行序列化。所以你不会隐式序列化你不应该的东西。

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

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).

于 2010-11-27T18:08:51.540 回答