gpt4 book ai didi

oop - Protocol Buffer 和 OO 设计

转载 作者:行者123 更新时间:2023-12-03 22:33:02 26 4
gpt4 key购买 nike

我在客户端-服务器架构中使用 Protocol Buffer 作为有线数据格式。域对象(java bean)将经历以下生命周期。

  • 用于客户端业务逻辑
  • 转换为 protobuf 格式
  • 传输到服务器
  • 转换回域对象
  • 用于服务器端业务逻辑

  • "Protocol Buffers and O-O Design" ProtoBuf 文档中的部分建议将生成的类包装在适当的域模型中。

    我想找出最好的方法。

    例如我有一个简单的原型(prototype)定义。
    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 定义复杂且嵌套时?

    最佳答案

    我没有使用 Protocol Buffer 的经验,但我不建议实现为特定序列化/传输框架量身定制的域对象。你将来可能会后悔。

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

    如果您想定义独立于序列化/传输的域对象,您有两种选择:

  • 在序列化/传输之前,将信息复制到协议(protocol)
    缓冲特定对象并将它们发送到您的服务器。你在那里
    必须将信息复制回您的域对象。
  • 使用非协议(protocol)序列化库,如 Kryo或者
    ProtoStuff直接将您的域对象转移到
    服务器。

  • 选项 1 的缺点是您的域被定义了两次(这对于修改来说是不可取的)和信息的复制(这会产生容易出错和不可维护的代码)。

    选项 2 的缺点是你失去了 schema evolution (尽管 ProtoStuff 显然是 supports it )并且完整的(可能很大的)对象图被序列化和传输。尽管您可以在序列化/传输之前修剪对象图(手动或使用 JGT )。

    关于oop - Protocol Buffer 和 OO 设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11773552/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com