协议缓冲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,那是因为我想在某些情况下手动编辑邮件的便宜(用编程方式)。
答案 0 :(得分:1)
Protostuff是另一个与Protobuf兼容的库,支持在“数字”模式下序列化为JSON。
答案 1 :(得分:0)
鉴于您的PS消息,我将采用与尝试序列化到XML或从XML序列化不同的路线。 puke 我发现Java等价于以下内容。
我会查看google/protobuf/io/printer.h来生成UTF-8,人类可读的对象,然后使用google/protobuf/io/tokenizer.h接口读回操作的protobuf对象。更简单,Protobuf为您完成了几乎所有的工作。