我很困惑 - 在.NET框架中应该何时使用XML序列化,何时使用二进制序列化?
我很困惑 - 在.NET框架中应该何时使用XML序列化,何时使用二进制序列化?
现有的两个回答都聚焦于"跨平台",但这是一个无关的问题。他们想表达的是,"如果你在进行跨平台操作,请不要使用 BinaryFormatter
" - 我完全支持这一点。然而,存在着一系列二进制序列化格式是非常适合跨平台的 - protobuf / ASN.1 就是很好的例子。
因此,我们来看看各自的优缺点:
注意,互操作性既不是其优点也不是缺点,只要你选择了合适的二进制格式!
这里有一个答案,比较了大多数 .NET 序列化器的序列化时间、反序列化和空间度量,供您参考。
针对.NET,如果您有两个使用相同类型系统的应用程序,则可以使用二进制序列化。另一方面,如果您有不同平台上的应用程序,则建议使用XML序列化。因此,如果我正在编写一个聊天应用程序(客户端和服务器),我可能会使用二进制序列化,但如果我后来决定使用Python编写客户端,则可能不会。
如果您需要用户友好或跨平台的输出,那么请使用XML。 此外,XML序列化使用公共字段和属性进行序列化,而您可以通过使用属性和自定义序列化来更改/重新格式化类级别上的输出。 Bin.Ser.使用私有字段进行序列化。
BinaryFormatter
确实是一个字段序列化器,但它不是唯一的二进制序列化器 - 大多数其他序列化器表现得更好 - 同样,DataContractSerializer
写入xml,并且除非类型被正确注释,否则作为字段序列化器。 - Marc GravellXmlSerializer
不同。“XML序列化”只是一种分类;XmlSerializer
是“XML序列化”API的一个具体示例。DataContractSerializer
也执行“XML序列化”。 - Marc Gravell