繁体   English   中英

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

[英]Should I use XML or Binary to send data from server to client?

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

什么更好用 - XML或我自己的二进制格式?

使用XML:

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

二进制:

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

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

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

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

当涉及到二进制,你不必有版本问题-技术,如Protocol Buffers的 (我有偏见:我为谷歌工作,我已经移植到PB C# )明确设计时考虑了向前和向后兼容性。 还有其他二进制格式需要考虑,例如Thrift

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

  • 简单的代码
  • 互通性
  • 在CPU方面的表现
  • 网络流量
  • 向后/向前兼容性
  • 在线格式的人类可读性

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

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

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

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

并且,在您更新之后,任何跨语言,跨平台和跨版本的要求都强烈地指出二进制格式。

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

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

XML的另一个优点是,您可以通过添加元素来扩展您发送的数据,在准备好之前,您不必更改接收器的代码以应对额外的数据。

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

文/ XML

  • 人类可读
  • 更容易调试
  • 通过压缩可以节省带宽
  • 标签记录了它们包含的数据

二进制

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

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

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

你没有说他们是否在同一台机器上。 我假设没有。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM