Questions tagged «protobuf»

2
Protobuf设计模式
我正在评估基于Java的服务的Google协议缓冲区(但希望使用与语言无关的模式)。我有两个问题: 第一个是一个广泛的一般性问题: 我们看到人们使用什么模式?所述模式与类组织(例如,每个.proto文件,打包和分发的消息)和消息定义(例如,重复字段vs.重复封装字段*)等有关。 在Google Protobuf帮助页面和公共博客上,此类信息很少,而对于已建立的协议(例如XML)则有大量信息。 对于以下两种不同的模式,我也有特定的问题: 将消息表示为.proto文件,将它们打包为一个单独的jar,然后将其发送给服务的使用者-这基本上是我认为的默认方法。 这样做,但在每条消息周围包括手工包装器(不是子类!),这些消息实现了至少支持这两种方法的协定(T是包装器类,V是消息类(使用泛型,但为简化起见简化了语法) : public V toProtobufMessage() { V.Builder builder = V.newBuilder(); for (Item item : getItemList()) { builder.addItem(item); } return builder.setAmountPayable(getAmountPayable()). setShippingAddress(getShippingAddress()). build(); } public static T fromProtobufMessage(V message_) { return new T(message_.getShippingAddress(), message_.getItemList(), message_.getAmountPayable()); } 我从(2)中看到的一个优点是,我可以隐藏由它引入的复杂性,V.newBuilder().addField().build()并在包装器中添加一些有意义的方法,例如isOpenForTrade()或isAddressInFreeDeliveryZone()等。我在(2)中看到的第二个优点是我的客户端处理了不可变的对象(可以在包装类中强制执行的事情)。 我在(2)中看到的一个缺点是我复制了代码,并且不得不将包装类与.proto文件进行同步。 有没有人对这两种方法有更好的技巧或进一步的批评? *通过封装重复字段,我的意思是像这样的消息: message ItemList { repeated …

1
为什么Protobuf 3将消息上的所有字段都设为可选?
protobuf的语法3使所有字段成为可选字段,从而删除了关键字required以及optional以前的proto2语法。阅读开发人员的一些评论似乎是为了增强向前/向后二进制兼容性而完成的。 但是对我而言,这可以通过仅对软件包名称进行版本控制(例如说)com.example.messages.v1,然后让客户端实施他们理解的反序列化程序来实施。同时,它删除了一些从软件工程的角度来看有用的合同类型。例如,如果我有 message Location { double latitude = 1; double longitude = 2; } 在proto3中,可以Location通过不提供必填字段之一来创建半备份但完全有效的文件。 创建基于模式的序列化格式以在客户端之间交换数据时,这不是一个很大的缺点吗?将额外的验证代码移至每个客户端以检查所有必填字段均具有有效值,这不是更糟吗?
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.