实现Java序列化独立编码

时间:2016-02-23 17:15:03

标签: serialization xstream asn.1 protocol-buffers

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

一个例子是在字节流中将对象从生产者传输到使用者。 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等。它们仅限于文本/ XML,需要类的名称。
  4. ASN.1:标准在那里,可以与OBJECT IDENTIFIER和类型定义一起使用,但它们缺少文档和教程。
  5. 我更喜欢第四种选择,因为它是一种标准。是否有任何支持此类要求的活动项目(特别是基于ASN.1的内容)?任何用法示例?该项目是否包含可在运行时选择的编解码器(DER,BER,XER等)?

    由于

2 个答案:

答案 0 :(得分: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)将支持在运行时切换编码规则。

答案 1 :(得分:1)

要添加到bosonix的答案,还有http://www.obj-sys.com/处的Objective System工具。 OSS和Objective Systems的文档包括许多示例用法。

ASN.1非常适合您所寻找的内容。我知道没有其他序列化系统可以做到这么彻底。

除了一系列不同的二进制编码(从全面标记的BER一直到非常紧凑的PER),它还可以执行XML,现在也可以使用JSON编码。这些都是由国际电联很好地标准化的,因此理论上它在工具供应商,编程语言,操作系统等之间是完全可互操作的。

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

执行此操作的唯一其他方法是XSD和JSON模式。然而,对于那些你不得不使用不同质量的工具来转换为源代码的人 - 我还没有看到任何适合JSON模式的工具。我不知道微软的xsd.exe是否也遵守这些限制。