将protobuf转换为其他protobuf

时间:2019-02-14 13:05:22

标签: protobuf-java

我已经从卡卡(Kaka)阅读了Protobuf,所以最终我得到了一个生成的Java对象。 我想根据自己的原始名称重命名/创建其他Protobuf。

说我有2个班级A和B。 我的代码听了Kafka主题并得到了A。 我想将A转换为B,这几乎是相同的Object(变量名称更改很少)。 有什么办法可以覆盖Protobuf解析器吗?为了生成B而不是A?

例如:

Class A{
String aa;
int aaaa;
}

Class B{
String bb;
int bbbb;
}

我的听众得到A,而我想得到B(bb = aa,bb = aaaa

1 个答案:

答案 0 :(得分:0)

假设A和B兼容(相同的标签具有相同的类型),则可以序列化您的原型并再次解析它。 如果一个对象中缺少某些标签,这也将起作用,但是如果两个标签存在不同类型,则解析将大部分失败。

原型:

Message A {
  string aa = 1;
  int32 aaaa = 2;
  int32 a_only = 3;
}

Message B {
  string bb = 1;
  int32 bbbb = 2;
  string b_only = 4;  // Must not be 3.
}

Java:

A a = GetAFromQueue();
B b = B.parseFrom(a.toByteArray());

另一个(可能更好)的选择是从Kafka获取消息作为字节数组,然后根据需要将其解析为A或B。这样就避免了重新序列化数据,尽管具有不同类型问题的相同标签仍然有用。

byte[] data = GetDataFromQueue();
A a = A.parseFrom(data);
[...]
B b = B.parseFrom(data);
相关问题