XSD 基于二进制序列化

XSD based binary serialisation

您好,我正在寻找 java 的二进制序列化,它: - 使用 xsd 作为架构 - 输出非常小的字节流 - 字节流不应包含字段名称和数据类型 - 应该尽可能地生成 pojos gor jaxb - 很高兴:在 java 脚本

中植入

有人知道解决这个问题的方法吗?

如果您使用的是 XSD 架构,传统的预期是您将序列化 to/from XML。那不是一个非常小的字节流;纯文本对于表示二进制数据(整数、浮点数等)来说效率很低。

但是有一个选择。 XSD 模式和 ASN.1 模式或多或少是可以互换的。甚至还有 ITU 定义的两者之间的官方翻译。有工具可以在两者之间进行转换。

为什么这很重要?那么,通过 ASN.1,您可以访问各种不同的有线格式。有一堆二进制的,还有文本的(包括,是的,XML 和 JSON)。重要的是其中一个二进制规则是 uPER(未对齐的打包编码规则),它将使用最少的位来表示正在发送的数据。

例如,假设您有一个带有整数字段的 class,并且您将其值限制在 0 到 7 之间。uPER 将只为该字段使用 3 位。

您可以拥有的是一个 XSD 模式,i) 被翻译成 ASN.1 并由 ASN.1 编译器 (OSS) 编译,或 ii) 由 ASN.1 编译器 (Obj) 直接编译-Sys),生成 Java POJO classes 可以序列化 to/from ASN.1 的 uPER 线格式(以及所有其他二进制格式,以及 XML 和 JSON 就此而言,取决于所使用的 ASN.1 编译器)。它与 jaxb / xjc 的工作方式类似。

据我所知,我在上一段中建议的工具需要来自 Objective Systems (obj-sys.com) 或 OSS Nokalva (www.oss.com),而且它们不是免费的(n.b。我一直是两者的客户,与他们没有其他关联)。我认为 XSD<-->ASN1 模式有一个免费的在线转换器,还有一些免费的 ASN1 编译器(尽管它们通常以 C 为目标,而不是 Java)。

链接:OSS's XSD translator, Objective System's Compiler reference for XSD translation, OSS Java support, Obj-Sys's Java support

讨论了 XSD、ASN.1 等,还有其他可能可用的选项,但可能意味着放弃 XSD 模式并使用其他选项。

Google 协议缓冲区

有 Java(和其他负载)Google 协议缓冲区的绑定,GBP 线格式是二进制的。它在数据大小方面不如 ASN.1 的 uPER,但肯定小于 XML 文本。参见 here。它有自己的模式语言,据我所知,XSD 和 GPB 之间没有翻译器。

Capn 原型

另一个有趣的选项(参见 project),同样是二进制格式。它在大小上不会完全击败 uPER,但序列化/反序列化速度很快(或者至少在 C/C++ 中)。同样,我知道它的模式语言和 XSD.

之间没有翻译