【问题标题】:Which is the most efficient serialization techninqe that must be language independent [closed]哪个是必须与语言无关的最有效的序列化技术[关闭]
【发布时间】:2014-01-28 13:14:06
【问题描述】:

目前我正在启动一个项目,该项目需要序列化来自 .net 应用程序(c# 应用程序)的数据,并将其通过网络传递给基于 java 的服务器应用程序。因此我想知道哪种序列化机制最有效,同时序列化的对象必须通过java应用程序反序列化。

查询:

我听说 protobuf 比任何其他序列化(如 xml)都快得多。是否可以使用 protobuf 来完成上述要求??

java中有一个新开发的技术叫做“Kryo”的序列化框架,比protobuf还要高效,那么.net环境中有没有这种东西必须是语言无关的。

【问题讨论】:

标签: c# java serialization protocol-buffers kryonet


【解决方案1】:

是的,protobuf 与语言无关。 Java 版本由 google 提供,multiple C# implementations(如果您希望两端的代码非常相似,我会推荐 protobuf-csharp-port,如果您更喜欢 .NET 代码看起来像惯用的 .NET,我会推荐 protobuf-net)。

Re Kryo - 我真的没有足够的知识发表评论,但回答“它是否更有效”问题的唯一方法是测试它(另外:定义效率对您意味着什么:序列化大小是多少?CPU时间?资源使用情况?还是……?)。就个人而言,我对它是否会变小有点怀疑,但是:有一个可靠的方法可以找出答案:你试试吧。

我不知道 Kryo 是否与语言无关,但我只能看到提到的 Java。

【讨论】:

  • +1。我要添加两件事;不要忘记测试中的压缩(例如,protobuf 仍然会击败压缩的 XML,但是对于已经熟悉该案例的 XML 的人来说,这样做是否值得?)。此外,语言独立性首先来自格式文档,其次来自库,并且只有指向允许为尚未考虑的语言构建库的格式文档才能面向未来)
  • @JonHanna 确实,当我查看 Kryo 页面时,我想到的主要事情是“而且......它实际上会产生什么?原始格式是什么?”
  • 与我发表评论的思维过程相同。
  • @MarcGravell,在我的情况下,效率指的是产生的序列化的大小和产生的时间以及反序列化对象的时间。此外,我很关心大小,因为我必须序列化大量数据(在 GB 范围内)并立即通过网络将其传递给用 java 编写的服务器应用程序。
  • @UserOverFlow 这很公平 - 但是,我仍然认为您将难以击败 protobuf 作为通用格式。您可以变得更小,但前提是您自己编写序列化的每个部分,并且不必担心版本容错之类的事情 - 例如,如果您总是可以省略字段标题 发送所有预期的字段。但这需要做很多工作。
【解决方案2】:

Hessian 是一种高效、二进制但与语言无关的序列化协议。

实现适用于 Java、C++、C#、Objective-C、PHP、Ruby、Javascript 等。

各种远程协议的性能比较可以在这里找到:
Java Remoting: Protocol Benchmarks

【讨论】:

    【解决方案3】:

    嗯..

    这当然取决于您希望在应用程序之间共享的数据类型。以下是我认为优缺点的简要概述。 您能否解释一下您想分享哪种类型的数据结构?

    我建议使用 XML 或 JSON,以提供灵活性。从长远来看,其他基于二进制的序列化选项将很困难,因为,

    • 它可能会干扰不可读/不可恢复的数据..
    • 支持可能会丢失,您自己的数据读取实现会更困难
    • XML 或 JSON 具有更清晰的语法,您可以轻松地为其编写自己的包装器,无论出于何种原因,所有工具都会消失 - 因为它是人类可读的

    Json 是一个选项

    1. 人类可读/可编辑
    2. 无需预先知道架构即可解析
    3. 出色的浏览器支持
    4. 比 XML 更简洁,但缺少“使用模式进行结构检查”

    XML 以及

    1. 人类可读/可编辑
    2. 无需预先知道架构即可解析
    3. SOAP 等标准
    4. 良好的工具支持(xsd、xslt、sax、dom 等)
    5. 与 JSON 相比相当冗长

    然后,

    Protobuf

    1. 非常密集的数据(小输出)
    2. 在不知道架构的情况下难以稳健地解码(数据格式在内部是不明确的,需要架构来澄清)
    3. 处理速度非常快
    4. 不适用于人眼(密集二进制)

    【讨论】:

      【解决方案4】:

      通信的语言独立性是通过契约优先方法实现的。创建一个清晰简单的交换格式规范,然后在两端找到最佳工具来帮助您遵守它。

      有线格式有两种基本选择:XML 和 JSON。

      XML 具有广泛理解的模式规范的优势,然后允许工具生成绑定代码。

      JSON 的优势在于它是一种更简单的格式,可以在任何语言中“组合在一起”。

      关于格式的速度 的任何陈述,这与指定平台上的现有实现 紧密相关。协议没有独立于语言的速度等级。

      【讨论】:

      • 除了 XML 和 JSON 之外,还可以使用很多很多的格式来实现语言独立性。
      • @MarcGravell 我指出了两个基本选择。
      猜你喜欢
      • 2023-03-21
      • 1970-01-01
      • 2011-03-10
      • 1970-01-01
      • 1970-01-01
      • 2010-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多