【发布时间】:2019-09-15 05:00:12
【问题描述】:
您好,我正在寻找 java 的二进制序列化: - 使用 xsd 作为架构 - 输出非常小的字节流 - 字节流不应包含字段名称和数据类型 - 应该像 gor jaxb 一样生成 pojos - 很高兴拥有:Java 脚本中的植入
有人知道解决办法吗?
【问题讨论】:
标签: java serialization xsd binary-serialization
您好,我正在寻找 java 的二进制序列化: - 使用 xsd 作为架构 - 输出非常小的字节流 - 字节流不应包含字段名称和数据类型 - 应该像 gor jaxb 一样生成 pojos - 很高兴拥有:Java 脚本中的植入
有人知道解决办法吗?
【问题讨论】:
标签: java serialization xsd binary-serialization
如果您使用的是 XSD 架构,通常的预期是您将序列化到 XML 或从 XML 序列化。这不是一个非常小的字节流;纯文本在表示二进制数据(整数、浮点数等)方面效率很低。
但是有一个选项。 XSD 模式和 ASN.1 模式或多或少是可以互换的。甚至还有国际电联定义的两者之间的官方翻译。有一些工具可以在两者之间进行转换。
为什么这是相关的?那么,使用 ASN.1,您可以访问各种不同的线路格式。有一堆二进制文件和文本文件(包括,是的,XML 和 JSON)。重要的是二进制之一是 uPER(未对齐打包编码规则),它将使用最少的比特来表示正在发送的数据。
例如,假设您有一个带有整数字段的类,并且您将其值限制在 0 到 7 之间。uPER 将只使用 3 位来表示该字段。
您可以拥有的 XSD 架构是 i) 转换为 ASN.1 并由 ASN.1 编译器 (OSS) 编译,或 ii) 由 ASN.1 编译器 (Obj-Sys) 直接编译,生成 Java POJO 类可以序列化到/从 ASN.1 的 uPER 线格式(以及所有其他二进制格式,以及 XML 和 JSON 也是如此,取决于使用的 ASN.1 编译器)。这与使用 jaxb / xjc 的工作方式类似。
我在上一段中建议的工具需要 AFAIK、来自 Objective Systems (obj-sys.com) 或 OSS Nokalva (www.oss.com) 的 ASN.1 专有编译器和工具,并且它们不是免费的(n.b.我一直是两者的客户,与他们没有其他关联)。我认为有一个用于 XSDASN1 模式的免费在线转换器,并且有一些免费的 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 协议缓冲区
Google Protocol Buffers 有 Java(以及其他许多)绑定,GBP 线格式是二进制的。它的数据大小不如 ASN.1 的 uPER,但肯定比 XML 文本小。见here。它有自己的模式语言,据我所知,XSD 和 GPB 之间没有翻译器。
Capn 原型
另一个有趣的选项(参见project),同样是二进制格式。它不会在大小上完全击败 uPER,但序列化/反序列化(或至少在 C/C++ 中)速度很快。同样,我知道它的模式语言和 XSD 之间没有翻译。
【讨论】: