【问题标题】:DataContractSerializer XML double the size of XML serializer output - Is this really faster and more scalable?DataContractSerializer XML 是 XML 序列化程序输出大小的两倍——这真的更快、更具可扩展性吗?
【发布时间】:2009-08-20 17:44:09
【问题描述】:

我正在升级一个 RESTful 服务,现在正在使用 DataContractSerializer 来输出响应。以前的版本只是使用带有 XmlSerializer 的自定义序列化。因为那个版本使用了很多属性,而 DCS 从来没有,所以我看到新的响应大小是使用 gzip 压缩时的先前版本大小的 1.5 倍。 (或未压缩时大小的近 3 倍)。

然后我的问题是,DCS 是否真的会成为比 XmlSerializer 更快、更具可扩展性的解决方案。

【问题讨论】:

  • DCS 通常更快——它被优化为更快——但它也有一些限制(不支持属性,例如)。您需要权衡什么对您来说更重要 - 序列化/反序列化的速度或小负载 - 您通常不能两者兼得.....选择一个。
  • 所以我想你必须自己做一些测量——在你给定的场景中更重要的是:(反)序列化的速度,或 XML 有效负载的大小——只有你才能真正决定最后
  • 感谢马克的输入。鉴于这是为了快速而设计的(公共 api、移动用户、响应时间要求),这是一个非常简单的调用。我有点失望,所有的指导在速度方面都显得如此误导。希望这个非常有用的信息能传出去。

标签: wcf xml-serialization datacontractserializer


【解决方案1】:

谁说它会更快、更具可扩展性?我不记得这是 DCS 的主要优势之一。有人曾经说过,DCS 可以序列化更快,但是传输时间往往会使序列化时间相形见绌。序列化速度提高 10% 并生成更大的有效负载,实际上可能会导致整体延迟增加 20%。

如果您不喜欢这个大小,可以尝试通过在DataMember attribute 中使用较短的名称来缩小原始 XML。不过,这种方法也适用于 XmlSerializer,使用 XmlElement 属性。使用 DCS,由于元素与属性的尺寸经济性,在尽可能小的尺寸方面您将始终处于 XmlSerializer 的劣势。

【讨论】:

  • 我所做的大部分搜索都推荐 DCS 而不是 XmlSerializer。您的回答似乎表明您原则上同意我的担忧。还有谁?有人有任何与现实世界基准相似的东西吗?
  • 你从哪里得到的研究?在 SO 上,有一种“DCS 很酷,XmlSerializer 昨天太棒了”的态度,但我不同意,也从未理解过。对其进行基准测试应该不难。但是,我建议性能不应该是您选择一个而不是另一个的主要标准。查看可维护性、可服务性、可靠性等。
  • 感谢芝士的回复。我同意速度通常是次要的观点,恐怕我不同意 DCS 是一项好技术。也就是说,我正在开发一个公共的、高流量的 api,它具有一些我必须能够满足的可扩展性和响应时间要求,既适用于我们自己的网站,也适用于合作伙伴。作为公开,我也必须能够保持向后兼容性,这意味着我将在一段时间内坚持这个决定。
  • 并不是说 DCS 太酷了——它速度很快,它还有其他优点(它甚至可以序列化私有字段,它有一个明确的“选择加入”模型并且只序列化你告诉它的内容)这确实使它在某些方面优于 XmlSerializer。它还有其他缺点(不支持属性就是其中之一)。
  • @marc_s - 是的,正如您指出的那样,DCS 和 XmlSerializer 有不同的优势。我要说的是,这里的态度平衡是 XmlSerializer 是昨天的技术,最好被遗忘或忽略。我不同意。
【解决方案2】:

好的,所以如果您正在考虑缩小 XML 有效负载的大小,那么答案似乎是 DataContractSerializer 比 XMLSerializer 慢。 (对我来说,这是衡量现实世界表现的关键组成部分)。 DCS 有一些不错的地方,但如果速度很重要,请跳过它。

我真的很想看看是否有人不同意这一点。

【讨论】:

  • 我不同意 XML 的大小是衡量性能的好方法。 XML 会被压缩吗?加密?它会以文本形式传输吗?在哪个编码中?还是二进制?这是一个错误的衡量标准,只是它指出 XML 序列化程序没有为您提供大部分选项。
  • 如果你可以下载 x 字节/秒,并且解决方案 a 是 10 字节,解决方案 b 是 20,那么 a 的传输时间将是 b 的两倍,除非大小低于数据包的大小。我假设网络速度比 CPU 更具有瓶颈,因此 10-15% 的 CPU 时间可能不会明显改变等式。在我的问题中,我以纯文本格式指定了响应的大小,并进行了 gzip 压缩。编码应该无关紧要,因为它会线性地改变大小。也就是说,我也将使用 JSONSerializer。这种灵活性很好
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-03
  • 1970-01-01
  • 1970-01-01
  • 2011-12-30
  • 2021-11-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多