使用Protobuf类与在Java中使用映射框架/层

使用Protobuf类与在Java中使用映射框架/层,java,protocol-buffers,grpc,Java,Protocol Buffers,Grpc,我在网上找不到在项目中使用gRPC和protobuf的任何“最佳实践”。 我正在实现一个源于事件的服务器端应用程序。 核心定义域聚合、事件和服务,而不具有外部依赖关系。gRPC服务器调用传入请求对象的核心服务,请求对象最终转换为发布的事件。事件使用protobuf序列化并在线路上发布。 我们目前处于一个两难的境地:我们的事件应该是protobuf直接生成的类,还是应该将核心和事件分开,并实现一个映射器/序列化器层来在protobuf核心之间转换事件 如果我们没有考虑其他方法,请指导我们:) 感谢

我在网上找不到在项目中使用gRPC和protobuf的任何“最佳实践”。 我正在实现一个源于事件的服务器端应用程序。 核心定义域聚合、事件和服务,而不具有外部依赖关系。gRPC服务器调用传入请求对象的核心服务,请求对象最终转换为发布的事件。事件使用protobuf序列化并在线路上发布。 我们目前处于一个两难的境地:我们的事件应该是protobuf直接生成的类,还是应该将核心和事件分开,并实现一个映射器/序列化器层来在protobuf核心之间转换事件

如果我们没有考虑其他方法,请指导我们:)


感谢您的帮助。

Protobufs非常适合序列化和向后兼容性,但不太适合作为一流Java对象。目前无法向protos添加自定义功能。通过在存根层使用ProtoBuf,将它们封装在一个事件POJO中,并在内部传递它们,您可以获得很多好处:

public final class Event {
 private final EventProto proto;

 public void foo() {
   // do something with proto.
 }
}

大多数项目不会经常更改它们的.proto文件,而且几乎从不以向后不兼容的方式(既不是wire也不是API)。在我的经验中,由于原型更改而不得不更改大量代码从来都不是问题

域模型对象和数据传输对象(Protobuf消息)应尽可能分开。为此,最好的方法是将域模型对象转换为Google Protobuf消息,反之亦然。我们制作了一个非常简单的链接。

虽然此链接可以回答问题,但最好在此处包含答案的基本部分,并提供链接供参考。如果链接页面发生更改,仅链接的答案可能无效。-迈克,我希望这个答案永远存在@Mike:考虑到这个问题需要一种方法,而且回答者已经概述了该方法以及链接,我不会将其归类为“仅链接”答案。看到了吗?你会说这对Golang的实施同样有影响吗?我会说是的。如果您熟悉为什么ViewModels应该与域模型分离。类似的想法在这里也适用。