java - 将 Protocol Buffer 序列化为 XML?

标签 java reflection xml-serialization protocol-buffers

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。

http://code.google.com/p/protostuff/wiki/JsonSerialization

关于java - 将 Protocol Buffer 序列化为 XML?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6017512/

相关文章:

java - 需要从 XML 写入 SQL Server 数据库的帮助(详细)

java - 尝试更改空字符串的反序列化方式时发生 ConvertException : Element annotation required for field

c# - .NET序列化: Best practice to map classes to elements and properties to attributes?

java - servlet请求参数字符编码

c# - 在 Visual Studio .NET 中调试动态加载的程序集

java - spring:如何定义属性文件位置优先级?

reflection - 编译型动态语言

java - 反射 - 继承的字段全部为 null 或为空

java - 类型安全 : Unchecked cast from Object to List

java - 数组相交方法中的空指针(java)