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