protobuf-java - 将 protobuf 转换为其他 protobuf
问题描述
我从 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
解决方案
假设 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);
推荐阅读
- javascript - 如果结果不是数字,我该如何重复循环?
- shopware - Shopware 6 - 模板未注册
- c++ - 为什么 char *s = (char*)tag.c_str(); 当标签是字符串时是错误的
- swift - 在 UI 测试期间未能阻止系统休眠。错误代码:-536870211
- reactjs - TestCafe 是否支持像 Jest 这样的快照测试?
- mapbox - Mapbox gl js - 基于多个标准的自定义图标
- google-apps-script - 允许未经授权的用户运行脚本
- html - 在 Firefox 中设置按钮的奇怪行为
- c# - C# DateTimeOffset LocalDateTime 与 ToLocalTime
- amazon-web-services - 用于嵌入式设备的 C 语言 WebRTC