Protocol Buffer Java tutorial状态:
One key feature provided by protocol message classes is reflection. [...] One very useful way to use reflection is for converting protocol messages to and from other encodings, such as XML or JSON.
如果你看看 com.google.protobuf.Message它说:
The biggest added features [of the Message class over the MessageLite class] are introspection and reflection.
这似乎表明 Protocol Buffer 已准备好与许多现有的基于 Java 反射的序列化库一起使用,但实际上我不认为它们意味着传统 Java 意义上的反射。
例如如果我尝试使用 XStream(一种使用反射将 Java 对象序列化为 XML 的流行库)序列化我的 Protocol Buffer 消息之一,我得到:
<com.x.MyProtos_-MyMessage resolves-to="com.google.protobuf.GeneratedMessageLite$SerializedForm">
<messageClassName>com.x.MyProtos$MyMessage</messageClassName>
<asBytes>CjkKDkJXQkUwMDAzNzkzMTA3EgsZAAAAAAAA8D8gASIGEJYBGMIDKhIpuB6F61G4nj8xuB6F61G4
Xnj8KMQoGQURBQkliEgsZAAAAAAAA8D8gASIGEJYBGMIDKhIpuB6F61G4nj8xuB6F61G4nj8qAyDQ
Dw==</asBytes>
[我注意到 XML 提到了 GeneratedMessageLite,即 MessageLite 的子类,即使序列化的实例是 com.google.protobuf.Message 的实例]
我发现的将 Protocol Buffer 序列化为 XML 的唯一现有解决方案(这样结果在某种程度上是人类可读的)是 protobuf-java-format .
这会产生很好的输出——但是因为它不输出标签值,即字段的数字 ID。因此,在反序列化方面,生成的 XML 看起来不会非常健壮,即据我所知,如果您更改字段名称但保留标记值,使用标准 Protocol Buffer 序列化,事情将继续正常工作相同,然后尝试反序列化在这些更改之前序列化的字节序列。
有没有人遇到过 XML 序列化解决方案,它保留了 Protocol Buffer 的大部分吸引人的特性(只是序列化时间较慢和结果消息较大的代价)?
或者想出如何利用流行的现有 Java XML 序列化库之一的 Protocol Buffer 的“反射”功能?
问候,
/乔治
PS 如果您想知道我为什么要序列化为 XML,那是因为我想要一种廉价的(在编程术语中)在某些情况下手动编辑消息的方式。
最佳答案
Protostuff 是另一个兼容 Protobuf 的库,支持以“数字”模式序列化为 JSON。
关于java - 将 Protocol Buffer 序列化为 XML?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6017512/