C# 我应该使用XML还是二进制文件将数据从服务器发送到客户端?

C# 我应该使用XML还是二进制文件将数据从服务器发送到客户端?,c#,c++,xml,C#,C++,Xml,我有两个独立的应用程序——一个是客户端(用C#),一个是服务器(用C++)。他们需要以“结构”的形式交换数据,并且从服务器到客户端每分钟发送大约1MB的数据 使用XML还是我自己的二进制格式更好 使用XML: 我相信,使用解析器将XML转换为结构会很慢?(“好”,但是:加载解析器,加载XML,解析) 另一个选项是使用正则表达式解析XML(坏!) 使用二进制: 紧凑的数据大小 不需要像标签这样的元信息 但结构不能轻易更改以适应未来结构中的新结构/新成员 无需将文本(XML)转换为二进制(结构

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

使用XML还是我自己的二进制格式更好

使用XML:

  • 我相信,使用解析器将XML转换为结构会很慢?(“好”,但是:加载解析器,加载XML,解析)
  • 另一个选项是使用正则表达式解析XML(坏!)
使用二进制:

  • 紧凑的数据大小
  • 不需要像标签这样的元信息
  • 但结构不能轻易更改以适应未来结构中的新结构/新成员
  • 无需将文本(XML)转换为二进制(结构),因此接收和“组装”到结构中的速度更快)

有什么建议吗?我应该不考虑二进制吗??对于采取什么方法有些困惑。

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

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

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

如您所述,XML速度稍慢,但更灵活、更可靠。我会一直使用XML,直到出现性能方面的问题

你也应该看看a作为替代品


而且,在更新之后,任何跨语言、跨平台和跨版本的要求都强烈反对二进制格式。

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

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

当涉及到二进制时,您不必有版本控制问题——像(我有偏见:我为谷歌工作,我已经)这样的技术在设计时明确考虑了向后和向前兼容性。还有其他二进制格式要考虑,例如.

但是,如果你担心性能,你应该真正衡量它。我非常确定我的手机能够足够快地解析1MB的XML,这样在这种情况下就不会有问题了。。。基本上找出你最关心的事情,包括:

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

这都是一种平衡行为——但你必须决定对每一个因素赋予多少权重。

text/xml

  • 可读
  • 易于调试
  • 通过压缩可以节省带宽
  • 标记记录它们包含的数据
二进制文件

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

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

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


此外,即使是XML的最小(快速)压缩也可以显著减少连线负载。

您也可以使用,它是结构化数据的紧凑二进制表示形式

您没有说它们是否在同一台机器上。我想不会吧

在这种情况下,二进制还有另一个缺点。您不能简单地在线路上转储结构,可能会有endianness和sizeof问题


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

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

嗨,我更新了这个问题。客户端在C++中,服务器是C++。现在有一个WCF的Windows本地库。寻找“Windows Web服务”,JSON呢。我们将所有接口记录为XML,但有一个用于XML->JSON转换的标准方法(仅在文档中)。然后我们的服务可以请求XML或JSON。因此,通常在调试时使用XML和JSON来提高效率。