Oop 协议缓冲区与面向对象设计

Oop 协议缓冲区与面向对象设计,oop,protocol-buffers,Oop,Protocol Buffers,我在客户机-服务器体系结构中使用协议缓冲区作为有线数据格式。域对象(JavaBeans)将经历以下生命周期 用于客户端业务逻辑 转换为protobuf格式 传输到服务器 已转换回域对象 用于服务器端业务逻辑 ProtoBuf文档中的一节建议将生成的类包装到适当的域模型中 我想找出最好的办法 例如,我有一个简单的原型定义 package customer; option java_package = "com.example"; option java_outer_classname = "Cu

我在客户机-服务器体系结构中使用协议缓冲区作为有线数据格式。域对象(JavaBeans)将经历以下生命周期

  • 用于客户端业务逻辑
  • 转换为protobuf格式
  • 传输到服务器
  • 已转换回域对象
  • 用于服务器端业务逻辑
  • ProtoBuf文档中的一节建议将生成的类包装到适当的域模型中

    我想找出最好的办法

    例如,我有一个简单的原型定义

    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定义复杂且嵌套时,是否存在任何性能问题?

    我没有协议缓冲区方面的经验,但我不建议实现为特定序列化/传输框架定制的域对象。你将来可能会后悔

    软件应用程序的域对象和逻辑应尽可能独立于特定的实现问题(在您的情况下是序列化/传输),因为您希望您的域在将来易于理解和可重用/可维护

    如果要独立于序列化/传输定义域对象,有两个选项:

  • 在序列化/传输之前,将信息复制到协议 缓冲特定对象并将其发送到服务器。给你 必须将信息复制回域对象
  • 使用非协议序列化库,如或 将域对象直接传输到 服务器
  • 选项1的缺点是您的域被定义了两次(这在修改方面是不可取的)和信息的复制(这会产生容易出错和不可维护的代码)

    选项2的缺点是丢失了(虽然很明显是原型),并且完整的(可能较大的)对象图被序列化和传输。尽管您可以在序列化/传输之前(手动或使用)修剪对象图。

    我们已经制定了一个解决方案,以解决将域模型对象转换为Google Protobuf消息的问题,反之亦然

    如何使用它:

    必须转换为protobuf消息的域模型类必须满足以下条件:

    • 类必须由@ProtoClass注释标记,该注释包含 对相关protobuf消息类的引用
    • 类字段必须由@ProtoField注释标记。这些字段必须有getter和setter
    例如:

    将用户实例转换为相关protobuf消息的代码:

    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);