将协议缓冲区序列化为XML?

时间:2011-05-16 12:39:53

标签: java reflection xml-serialization protocol-buffers

协议缓冲Java tutorial个状态:

  

协议消息类提供的一个关键功能是反射。 [...]一种非常有用的反射方法是将协议消息转换为其他编码,例如XML或JSON。

如果你看com.google.protobuf.Message它说:

  

MessageLite类的Message类的最大附加功能是内省和反思。

这似乎表明协议缓冲区已准备好与许多现有的基于Java反射的序列化库一起使用,但实际上我并不认为它们意味着传统Java意义上的反映。

E.g。如果我尝试使用XStream(一个用于使用反射将Java对象序列化为XML的流行库)序列化我的一个协议缓冲区消息,我得到:

<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的实例]

我发现将协议缓冲区序列化为XML的唯一现有解决方案(结果有些人类可读)是protobuf-java-format

这会产生很好的输出 - 但是因为它不输出标记值,即字段的数字ID。因此,在反序列化方面看起来并不像生成的XML会非常健壮,即据我所知,使用标准协议缓冲区序列化,如果更改字段名称,事情将继续正常工作,但保留标记值相同,然后尝试反序列化在这些更改之前序列化的字节序列。

有没有人遇到过一个XML序列化解决方案,该解决方案保留了协议缓冲区的大部分吸引人的功能(只会减慢序列化时间和更大的结果消息)?

或者研究如何利用协议缓冲区的“反射”功能和一个流行的现有Java XML序列化库?

此致

/乔治

如果你想知道我为什么要序列化为XML,那是因为我想在某些情况下手动编辑邮件的便宜(用编程方式)。

2 个答案:

答案 0 :(得分:1)

Protostuff是另一个与Protobuf兼容的库,支持在“数字”模式下序列化为JSON。

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

答案 1 :(得分:0)

鉴于您的PS消息,我将采用与尝试序列化到XML或从XML序列化不同的路线。 puke 我发现Java等价于以下内容。

我会查看google/protobuf/io/printer.h来生成UTF-8,人类可读的对象,然后使用google/protobuf/io/tokenizer.h接口读回操作的protobuf对象。更简单,Protobuf为您完成了几乎所有的工作。