协议缓冲区Java tutorial声明:
协议消息类提供的一个关键特性是反射。[…]使用反射的一种非常有用的方法是将协议消息转换为其他编码(如XML或JSON)或从其他编码转换协议消息。
如果你看com.google.protobuf.Message它会说:
最大的附加特性[消息类比消息精简类]是内省和反射。
这似乎表明协议缓冲区已经准备好与许多现有的基于Java反射的序列化库一起使用,但实际上我认为它们并不意味着在传统的Java意义上的反射。
例如,如果我试图用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(这样的结果在某种程度上是人类可读的),我发现是“AA>”。
这会产生很好的输出-但是它不输出标记值,即字段的数字id。因此,在反序列化方面,也就是说,据我所知,使用标准协议缓冲区序列化,结果xml看起来并不是非常健壮,如果更改字段名,但保持标记值不变,然后尝试反序列化之前序列化的字节序列,则事情将继续正常工作。变化。
有没有人遇到过一个XML序列化解决方案,它保留了协议缓冲区的大部分吸引人的特性(只不过会带来序列化时间变慢和生成的消息变大的损失)?
或者利用现有流行的Java XML序列化库中的一种来解决如何利用协议缓冲区的“反射”特性?
当做,
/乔治
ps如果你想知道为什么我要序列化成xml,那是因为我想要一种廉价的(从编程的角度)方式在某些情况下手动编辑消息。

最佳答案

protostuff是另一个与protobuf兼容的库,支持在“数值”模式下序列化为json。
http://code.google.com/p/protostuff/wiki/JsonSerialization

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

10-09 05:49
查看更多