在.NET框架中,什么情况下应该使用XML序列化而不是二进制序列化?

16

我很困惑 - 在.NET框架中应该何时使用XML序列化,何时使用二进制序列化?


只是想要吗?还是有任何情况需要考虑? - Lei Yang
3个回答

37

现有的两个回答都聚焦于"跨平台",但这是一个无关的问题。他们想表达的是,"如果你在进行跨平台操作,请不要使用 BinaryFormatter" - 我完全支持这一点。然而,存在着一系列二进制序列化格式是非常适合跨平台的 - protobuf / ASN.1 就是很好的例子。

因此,我们来看看各自的优缺点:

  • 二进制通常更小,处理速度更快(两端均如此),但不易于人类阅读 / 编辑
  • 文本格式(xml / json)往往比二进制更冗长(尽管通常可以压缩得很好),但手动处理起来相对容易;但所有这些文本处理和映射往往会使它们变慢
    • xml 在 Web 服务中非常常见,并且受益于诸如 xsd、xslt 和强大的 xml 编辑器等 Google 支持
    • json 是浏览器通信的主要参与者(虽然它也用于 Web 服务)- 倾向于不太正式但仍然非常有效

注意,互操作性既不是其优点也不是缺点,只要你选择了合适的二进制格式!

这里有一个答案,比较了大多数 .NET 序列化器的序列化时间、反序列化和空间度量,供您参考。


有点好奇,你是怎么找到你的旧答案的?就在今天,我试图追踪我的一个最近回答的相关问题,但是我花了很长时间才找到它。 - H.B.

14

针对.NET,如果您有两个使用相同类型系统的应用程序,则可以使用二进制序列化。另一方面,如果您有不同平台上的应用程序,则建议使用XML序列化。因此,如果我正在编写一个聊天应用程序(客户端和服务器),我可能会使用二进制序列化,但如果我后来决定使用Python编写客户端,则可能不会。


如果你在说“XML序列化”时包含了数据契约序列化器,那么我同意你的说法。 - John Saunders
6
“二进制”不是问题所在;这里并非说二进制不可互操作——仅仅是因为“BinaryFormatter”(二进制序列化器的一个特定例子)是一个糟糕的选择。还有其他几种选择。 - Marc Gravell
@Adeel,你更喜欢“than”还是“then”? - Lei Yang

2

如果您需要用户友好或跨平台的输出,那么请使用XML。 此外,XML序列化使用公共字段和属性进行序列化,而您可以通过使用属性和自定义序列化来更改/重新格式化类级别上的输出。 Bin.Ser.使用私有字段进行序列化。


1
叹息;哦,那些老神话...为了反驳两个观点;虽然BinaryFormatter确实是一个字段序列化器,但它不是唯一的二进制序列化器 - 大多数其他序列化器表现得更好 - 同样,DataContractSerializer写入xml,并且除非类型被正确注释,否则作为字段序列化器。 - Marc Gravell
DataContractSerializer,WCF?在这个问题中没有一个字提到它。 - SeeSharp
我的参考资料是“XML序列化”,它与XmlSerializer不同。“XML序列化”只是一种分类;XmlSerializer是“XML序列化”API的一个具体示例。DataContractSerializer也执行“XML序列化”。 - Marc Gravell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接