Serializable对象与非可序列化对象的区别是什么,以及什么使对象可序列化?可序列化对象与xml有什么关系?
由于
答案 0 :(得分:5)
Serializable对象与非可序列化对象的区别是什么
可序列化对象可以转换为其他表示形式(如文本),以便跨进程边界轻松传输,而非可序列化对象则不能。
是什么使对象可串行
在.NET中,根据您决定使用的序列化程序,该对象需要符合某些要求。例如,如果您使用BinaryFormatter,则需要使用[Serializable]
属性修饰对象。
可序列化对象与xml
有什么关系
可以将对象序列化为XML。在.NET中,这可以通过XmlSerializer类以及DataContractSerializer来实现。
答案 1 :(得分:3)
问题几乎从不是您是否可以序列化对象。真正的问题通常是:当你反序列化时,你可以重建对象的可用和逐字副本。
一个很好的例子是Windows窗体控件。没有父级的控件不能存在,比如托管它的表单。对控件进行反序列化会使您在没有父控件的情况下使用控件,您必须序列化整个对象图以使其有意义。然后,有些属性具有在反序列化时不会重现的运行时值。例如Handle属性。 Windows不会重现相同的句柄。或者快捷键指示符是否加下划线(按Alt键)。这关键取决于整个计划的状态。因此,Control没有[Serializable]属性。
答案 2 :(得分:2)
这里的答案是正确的,但是从不同的角度攻击这个概念,并希望增加你的理解,我提出以下建议:
将'serializable'这个词想象成'可转换'。因此,当一个类被标记为可序列化时,它可以转换为您正在寻找的任何类型的表示。串行器(即BinaryFormatter或XmlSerializer)可以被认为是“转换器”。
有了这个,可以这么说,你可以使用转换器( serializer )来转换 convertable em>( serializable )。类本身不会改变,但它确实为类添加了功能。
原因举例:
序列化时需要考虑一些注意事项(例如,您通常不希望在.NET中序列化事件,并使用[field:non-serialized]属性标记它们),因此需要进行更多研究在这方面,但从概念上讲,试着将其视为转换对象进行存储或传输。
答案 3 :(得分:1)
可串行化的对象可以“分开”,通过各种信道传输,并在接收信道的末端“重建”,接收信道可以是处于“分开”状态的完全其他位置。您可能已经听过在讨论序列化过程中提到的xml,因为xml为此提供了一种机制。
考虑以下对象:
Person p = new Person();
p.Age = 33;
p.Name = "Magni";
如果您想将此对象保存在当前状态 - 您可以有效地将其表示为:
<Person>
<Name>Magni</Name>
<Age>33</Age>
</Person>
然后可以通过网络发送此XML,并且在不同平台的情况下,可以由另一个实体或服务重建或使用原始Person对象。
这是一个30000英尺的视图,序列化经常变得复杂,但我试图从最广泛的意义上回答你的问题。