代码之家  ›  专栏  ›  技术社区  ›  Tegra Detra

带协议缓冲区的Java序列化

  •  5
  • Tegra Detra  · 技术社区  · 14 年前

    协议缓冲区与O-O设计 协议缓冲类基本上是 C++不适合做一流的 对象模型中的公民。如果你 生成类,最好的方法 这是为了包装生成的协议 中的缓冲类 特定于应用程序的类。包装 协议缓冲区也是一个好主意 如果你不能控制 .proto文件的设计(如果, 你在重复利用一个又一个 包装类来创建 应用程序的环境: 隐藏一些数据和方法,暴露 方便功能等 从不将行为添加到生成的 会破坏内部机制 不好的面向对象实践

    发件人: http://code.google.com/apis/protocolbuffers/docs/javatutorial.html

    当它说要包装创建的类是什么意思?

    3 回复  |  直到 14 年前
        1
  •  11
  •   Ian Vaughan    6 年前

    透视图1

    您编写一个.proto文件并将其交给生成构建器代码的protoc。他们建议不要在生成的代码中添加任何方法。如果您想在生成的代码中添加一些自定义行为,那么就编写自己的类来包装生成的代码。

    public class XmlToMyMessageBuilder
    {
        private final MyMessageBuilder protoBuilder;
    
        public MyMessage fromXml(byte[] input()
        {
            protoBuilder.setXXX();
        }
    }
    

    这是一个通用的良好编程原则。

    通过提供中介,您还可以将代码与底层序列化机制分离。这允许您切换序列化器实现(例如,您希望序列化一个负载,其中所有数据都是字符串格式的……其中带压缩的JSON系列化是更好的选择),并且影响较小。你可以这样做

    public interface MySerializer
    {
        boolean serialize(MyDomainObject input);
    }
    
    public PBBasedSerializer implements MySerializer
    {
        private final MyMessageBuilder protoBuilder;
        ...
    }
    
    public JsonBasedSerializer implements MySerializer
    {
        private final JSONSerializer jsonSerializer;
        ...
    }
    
        2
  •  3
  •   MForster    14 年前

    协议缓冲区类是从.proto文件生成的。这些生成的类都有直接操作它们包含的字段的所有方法。但是他们没有比修改字段更高级别操作的方法。

    然后,包装器类可以为API的用户提供更丰富或更受限的接口。由于对协议缓冲区的任何修改都需要经过包装对象,因此可以完全控制要支持的操作。

        3
  •  -1
  •   Bill the Lizard    14 年前

    当它说要包装创建的类是什么意思?