Oop 协议缓冲区与面向对象设计
我在客户机-服务器体系结构中使用协议缓冲区作为有线数据格式。域对象(JavaBeans)将经历以下生命周期Oop 协议缓冲区与面向对象设计,oop,protocol-buffers,Oop,Protocol Buffers,我在客户机-服务器体系结构中使用协议缓冲区作为有线数据格式。域对象(JavaBeans)将经历以下生命周期 用于客户端业务逻辑 转换为protobuf格式 传输到服务器 已转换回域对象 用于服务器端业务逻辑 ProtoBuf文档中的一节建议将生成的类包装到适当的域模型中 我想找出最好的办法 例如,我有一个简单的原型定义 package customer; option java_package = "com.example"; option java_outer_classname = "Cu
package customer;
option java_package = "com.example";
option java_outer_classname = "CustomerProtos";
message Customer {
required string name = 1;
optional string address = 2;
}
这就是域模型的定义方式。如您所见,数据完全存储在proto builder对象中
package com.example;
public class CustomerModel
{
private CustomerProtos.Customer.Builder builder = CustomerProtos.Customer.newBuilder();
public String getName()
{
return builder.getName();
}
public void setName(String name)
{
builder.setName(name);
}
public String getAddress()
{
return builder.getAddress();
}
public void setAddress(String address)
{
builder.setAddress(address);
}
public byte[] serialize()
{
return builder.build().toByteArray();
}
}
这是一种好的做法吗?因为这些对象在生命周期的所有阶段都使用,但我们只需要在客户机-服务器传输阶段使用protocolbuf格式
访问proto builder类getter/setter方法时,特别是当proto定义复杂且嵌套时,是否存在任何性能问题?我没有协议缓冲区方面的经验,但我不建议实现为特定序列化/传输框架定制的域对象。你将来可能会后悔 软件应用程序的域对象和逻辑应尽可能独立于特定的实现问题(在您的情况下是序列化/传输),因为您希望您的域在将来易于理解和可重用/可维护 如果要独立于序列化/传输定义域对象,有两个选项:
- 类必须由@ProtoClass注释标记,该注释包含 对相关protobuf消息类的引用李>
- 类字段必须由@ProtoField注释标记。这些字段必须有getter和setter
User userDomain = new User();
...
ProtobufUser userProto = Converter.create().toProtobuf(ProtobufUser.class, userDomain);
反向转换代码:
User userDomain = Converter.create().toDomain(User.class, userProto);
对象列表的转换类似于单个对象的转换。对于Dart Lang是否有等效的解决方案?或者,出现了任何新的最佳实践来转换消息/域对象,反之亦然?您是否找到了解决此问题的良好实践(proto vs OO)?完全同意@Barry。如果将相同的protobuf生成的pojo用作构建逻辑的domian对象,那么很快就会变得混乱。正如所建议的,它基本上只是为了方便服务交流,不考虑语言,仅此而已。有像wrapper这样的解决方案,但每个protobuf对象都有imgine wrapper,这完全是一团乱。从我的观点来看,最好为每个proto使用converter util,或者使用任何映射器库(如果有的话)。
User userDomain = Converter.create().toDomain(User.class, userProto);