【问题标题】:Implementing Java serialization independent encoding实现Java序列化独立编码
【发布时间】:2016-06-05 16:02:33
【问题描述】:

我想在表示层中使用几种编码来编码应用层中的对象/结构,独立于编码方案(例如二进制、XML 等)和编程语言(Java、Javascript、PHP、C)。

例如,将对象以字节流的形式从生产者传输到消费者。 Java 客户端会使用以下代码对其进行编码:

Object var = new Dog(); 
output.writeObject(var);

服务器将共享 Dog 类定义,并可以通过以下方式重新生成对象:

Object var = input.readObject(); 
assertTrue(var instanceof Dog); // passes

需要注意的是,生产者和消费者不会共享 var 的类型,因此,消费者不需要类型来解码 var。他们只会共享数据类型定义,如果有的话:

public interface Pojo {}
public class Dog implements Pojo { int i; String s; } // Generated by framework from a spec

我发现了什么:

  1. Java 序列化:它取决于语言。不能与例如 javascript 一起使用。
  2. Protobuf 库:仅限于特定的二进制格式。无法支持其他二进制格式。需要类名(消息的“类”)。
  3. XStream、Simple 等。它们仅限于 text/XML 并且需要类的名称。
  4. ASN.1:标准已经存在,可以与 OBJECT IDENTIFIER 和类型定义一起使用,但缺乏文档和教程。

我更喜欢第四个选项,因为它是一个标准。是否有任何支持此类要求的活动项目(特别是基于 ASN.1 的项目)?有使用示例吗?项目是否包含可在运行时选择的编解码器(DER、BER、XER 等)?

谢谢

【问题讨论】:

    标签: serialization xstream asn.1 protocol-buffers


    【解决方案1】:

    您可以找到多个 ASN.1 工具的开源和商业实现。这些通常包括:

    • 架构编译器,它将以您所需的编程语言生成代码
    • 一个运行时库,与生成的代码一起用于编码和解码

    ASN.1主要用于电信行业的标准化通信协议,所以商用工具对ASN.1标准和各种编码规则都有很好的支持。

    这里有一些入门教程,甚至是免费的电子书:

    http://www.oss.com/asn1/resources/asn1-made-simple/introduction.html

    http://www.oss.com/asn1/resources/reference/asn1-reference-card.html

    http://www.oss.com/asn1/resources/books-whitepapers-pubs/asn1-books.html

    我知道OSS ASN.1商业工具(http://www.oss.com/asn1/products/asn1-products.html)会支持在运行时切换编码规则。

    【讨论】:

      【解决方案2】:

      为了补充 bosonix 的答案,http://www.obj-sys.com/ 上还有 Objective System 的工具。来自 OSS 和 Objective Systems 的文档包含许多示例用法。

      ASN.1 非常适合您的需求。我知道没有其他序列化系统可以如此彻底地做到这一点。

      除了一系列不同的二进制编码(从全面标记的 BER 一直到非常组合的 PER),它还支持 XML,现在也支持 JSON 编码。这些都被 ITU 很好地标准化了,所以理论上它在工具供应商、编程语言、操作系统等之间完全可以互操作。

      ASN.1 还有其他显着优势。模式语言允许您定义对消息字段值或数组大小的约束。然后通过生成的代码为您检查这些。这比许多其他序列化要完整得多。例如,Google Protocol Buffers 不允许您这样做,这意味着您必须检查手写代码中消息字段的范围(如果适用)。这很乏味、容易出错并且难以维护。

      唯一能做到这一点的其他模式是 XSD 和 JSON 模式。但是,对于那些用于将它们转换为源代码的工具的质量不同,我还没有看到任何适合 JSON 模式的工具。我不知道微软的 xsd.exe 是否也遵守这些限制。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-11-01
        • 2018-10-21
        • 2014-05-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多