看到您可以将任何文档转换为字节数组并将其保存到磁盘,然后将文件重建为其原始格式(只要您的文件名包含元数据等)。
为什么你要用[Serializable]
等标记一个班级?这是一个相同的想法,“元数据”类型信息,所以当你将对象转换为它的类时,事物是否正确映射?
答案 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 one,this one和this one。他们认为序列化应该是您必须明确选择的功能。
对于一个对位点,该问题的接受答案表明,默认情况下类应该是可序列化的。
答案 5 :(得分:0)
我认为这是一个提示,我将允许该类序列化。因此,您不要隐式序列化您不应该的东西。
不知道这是设计师的意图。
顺便说一句,我只是喜欢BinaryFormatter
并尽可能多地使用它。它可以自动处理大部分内容(例如重建复杂的对象图,其中重复的引用遍布整个图形)。