我应该使用XML还是Binary将数据从服务器发送到客户端?

时间:2010-02-02 09:56:14

标签: c# c++ xml

我有两个独立的应用程序 - 一个是客户端(在C#中),一个是服务器(在C ++中)。他们需要以“结构”的形式交换数据,每分钟大约1 MB的数据从服务器发送到客户端。

最好使用 - XML还是我自己的二进制格式?

使用XML:

  • 我相信使用解析器将XML转换为结构会很慢吗? (“好”,但是:加载解析器,加载XML,解析)
  • 另一个选择是用regex解析XML(坏!)

二进制:

  • 紧凑型数据
  • 不需要像标签这样的元信息;
  • 但结构不能轻易改变以适应未来结构中的新结构/新成员;
  • 没有必要从文本(XML)转换为二进制(struct),因此接收和“汇编”到结构中的速度更快)

任何指针?我根本不应该考虑二进制吗?对于采取何种方法有点困惑。

9 个答案:

答案 0 :(得分:7)

如果您有合理的网络连接,每分钟1MB的数据非常小。

二进制和XML之间还有其他选择 - 其他人类可读的文本序列化格式,例如JSON。

说到二进制文件,你不会 有版本问题 - 像Protocol Buffers这样的技术(我有偏见:我为Google工作而我{{3}明确设计时考虑了向后和向前兼容性。还有其他二进制格式需要考虑,例如ported PB to C#

如果你担心性能,你应该真正衡量它。我非常确定我的手机可以足够快地解析1MB的XML,因为在这种情况下它不会成为问题...基本上可以解决你最关心的问题:< / p>

  • 简单的代码
  • 互操作性
  • CPU的性能
  • 网络流量
  • 向后/向前兼容性
  • 线上格式的人类可读性

这都是一种平衡行为 - 但你必须决定给予每个因素多少重量。

答案 1 :(得分:2)

如果两端都有.NET应用程序,请使用 Windows Communication Foundation 。这将允许您将决策推迟到部署时间,因为它支持二进制和XML序列化。

答案 2 :(得分:2)

正如你所说,XML是一个(小)慢,但更灵活,更可靠。我会使用XML,直到出现性能问题。

您还应该看一下ProtoBuff作为替代方案。

而且,在您更新之后,任何跨语言,跨平台和跨版本的要求都会远离二进制格式。

答案 3 :(得分:1)

XML的一个优点是互操作性。您是否有其他客户也可以访问您的服务器?

在使用自己的二进制格式或在XML上执行regex之前......您是否考虑过.NET中的序列化命名空间?有二进制格式化程序,SOAP格式化程序,还有XmlSerialization。

答案 4 :(得分:1)

XML的另一个优点是你可以通过添加一个元素来扩展你发送的数据,你不必改变接收者的代码来处理额外的数据,直到你准备好。

即使是最小化(快速)的XML压缩也可以大大减少线缆负载。

答案 5 :(得分:0)

文字/ XML

  • 人类可读
  • 易于调试
  • 可以通过压缩来保存带宽
  • 标签记录其中包含的数据

<强>二进制

  • 紧凑
  • 易于解析(如果使用固定大小的字段,只需覆盖结构)
  • 难以调试(十六进制编辑很痛苦)
  • 需要单独的文档来了解数据是什么。

两种表单都是可扩展的,只要在数据报的开头插入一个类型和版本字段,就可以升级到更新的版本。

答案 6 :(得分:0)

您还可以使用Google Protocol Buffers,这是结构化数据的紧凑二进制表示。

答案 7 :(得分:0)

你没有说他们是否在同一台机器上。我不认为。

在那种情况下,二元有另一个缺点。你不能简单地将结构转储到线上,你可能会有字节序和大小问题。

XML非常冗长,YAML或JSON要小得多

答案 8 :(得分:0)

不要忘记大多数人认为XML是XML序列化为文本。它可以序列化为二进制。这就是netTcpBinding和其他此类绑定在WCF中的作用。 XML信息集以二进制形式输出,而不是文本输出。它仍然是XML,只是二进制。