0

我从 Kaka 阅读了 Protobuf,所以最后我得到了一个生成的 Java 对象。我想根据我得到的原始文件重命名/创建其他 Protobuf。

假设我有 2 个类 A 和 B。我的代码听 Kafka 主题并获得 A。我想将 A“转换”为 B,这几乎是相同的对象(变量名称更改很少)。有没有办法覆盖 Protobuf Parser?为了生成 B 而不是 A?

例如:

Class A{
String aa;
int aaaa;
}

Class B{
String bb;
int bbbb;
}

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

4

1 回答 1

2

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

原型:

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.
}

爪哇:

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);
于 2019-05-07T05:17:57.530 回答