Serialization 实现Java序列化无关编码

Serialization 实现Java序列化无关编码,serialization,xstream,asn.1,protocol-buffers,Serialization,Xstream,Asn.1,Protocol Buffers,我想在表示层中使用几种编码来对应用层中的对象/结构进行编码,独立于编码方案(如二进制、XML等)和编程语言(Java、Javascript、PHP、C) 例如,在字节流中将对象从生产者传输到消费者。Java客户端将使用如下方式对其进行编码: Object var = new Dog(); output.writeObject(var); Object var = input.readObject(); assertTrue(var instanceof Dog); // passes 服

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

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

Object var = new Dog(); 
output.writeObject(var);
Object var = input.readObject(); 
assertTrue(var instanceof Dog); // passes
服务器将共享Dog类定义,并可以通过如下方式重新生成对象:

Object var = new Dog(); 
output.writeObject(var);
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
我发现:

  • Java序列化:它依赖于语言。不能与例如javascript一起使用
  • Protobuf库:它仅限于特定的二进制格式。不可能支持其他二进制格式。需要类的名称(消息的“类”)
  • XStream、Simple等。它们仅限于text/XML,并且需要类的名称
  • ASN.1:这些标准已经存在,可以与对象标识符和类型定义一起使用,但它们缺乏文档和教程 我更喜欢第四种选择,因为它是一种标准。是否有支持此类需求的活动项目(特别是基于ASN.1的项目)?有使用示例吗?该项目是否包括可在运行时选择的编解码器(DER、BER、XER等)


    谢谢

    您可以找到几个用于ASN.1的开源和商业化工具实现。这些措施通常包括:

    • 模式的编译器,它将生成所需编程语言的代码
    • 与生成的代码一起用于编码和解码的运行时库
    ASN.1主要用于电信行业的标准化通信协议,因此商业工具对ASN.1标准和各种编码规则有很好的支持

    以下是一些入门教程,甚至是免费电子书:


    我知道OSS ASN.1商业工具()将支持在运行时切换编码规则。

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

    • 模式的编译器,它将生成所需编程语言的代码
    • 与生成的代码一起用于编码和解码的运行时库
    ASN.1主要用于电信行业的标准化通信协议,因此商业工具对ASN.1标准和各种编码规则有很好的支持

    以下是一些入门教程,甚至是免费电子书:


    我知道OSS ASN.1商业工具()将支持在运行时切换编码规则。

    为了补充bosonix的答案,还有Objective System的工具。OSS和Objective系统的文档都包含许多示例使用

    ASN.1非常适合您所寻找的内容。据我所知,没有其他序列化系统能如此彻底地做到这一点

    除了一系列不同的二进制编码(从全面标记的BER一直到打包的PER),它还可以进行XML编码,现在还可以进行JSON编码。ITU对这些标准进行了很好的标准化,因此理论上,工具供应商、编程语言、操作系统等之间完全可以互操作

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


    只有XSD和JSON模式可以做到这一点。然而,对于这些工具,您将受制于用于将它们转换为源代码的工具的不同质量——我还没有看到任何适合JSON模式的工具。我也不知道微软的xsd.exe是否遵守这些限制。

    为了补充bosonix的答案,还有Objective System的工具。OSS和Objective系统的文档都包含许多示例使用

    ASN.1非常适合您所寻找的内容。据我所知,没有其他序列化系统能如此彻底地做到这一点

    除了一系列不同的二进制编码(从全面标记的BER一直到打包的PER),它还可以进行XML编码,现在还可以进行JSON编码。ITU对这些标准进行了很好的标准化,因此理论上,工具供应商、编程语言、操作系统等之间完全可以互操作

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

    只有XSD和JSON模式可以做到这一点。然而,对于这些工具,您将受制于用于将它们转换为源代码的工具的不同质量——我还没有看到任何适合JSON模式的工具。我也不知道微软的xsd.exe是否遵守这些限制