为什么必须使用[serializable]属性标记一个类?

时间:2010-04-07 18:57:39

标签: c# serialization attributes serializable

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

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

6 个答案:

答案 0 :(得分:24)

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

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

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

答案 1 :(得分:16)

首先,你没有 来。

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

XMLSerializer还要求在类中使用零参数构造函数。

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

答案 2 :(得分:2)

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

答案 3 :(得分:2)

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

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

答案 4 :(得分:2)

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

有关详细信息,请参阅Why Java needs Serializable interface?的优秀答案,尤其是this onethis onethis one。他们认为序列化应该是您必须明确选择的功能。

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

答案 5 :(得分:0)

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

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

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