我想在Java应用程序中使用protobuff来促进序列化,我对Google网站上的这句话有疑问
协议缓冲区和O-O设计 协议缓冲类基本上是 愚蠢的数据持有者(如结构中的结构) C ++);他们没有做好头等舱 公民在对象模型中。如果你 想要为a添加更丰富的行为 生成类,最好的方法 这是包装生成的协议 缓冲类在 特定于应用程序的类。包皮 协议缓冲区也是一个好主意 如果你没有控制权 .proto文件的设计(如果,比方说, 你正在重复使用彼此 项目)。在这种情况下,您可以使用 用于制作的包装类 界面更适合独特 您的应用环境: 隐藏一些数据和方法,暴露 便利功能等你应该 永远不会为生成的行为添加行为 通过继承它们的类。这个 将打破内部机制,是 不善于面向对象的实践 反正。
来自:http://code.google.com/apis/protocolbuffers/docs/javatutorial.html
它说要包装创建的类是什么意思?
答案 0 :(得分:10)
观点1
您编写.proto文件并将其提供给生成Builder代码的protoc。他们建议不要在生成的代码中添加任何方法。如果你想要将一些自定义行为添加到生成的代码中,那么写下你自己的CLASSPING生成的代码。
例如,让我们说protoc生成的类是MyMessageBuilder。并且您想要添加一个方法,该方法可以将XML输入和spitout特定于protobuff的消息输出。你可以编写一个XmlToMyMessageBuilder,如下所示。在这里使用XmlToMyMessageBuilder,您的类将包装生成的代码并从XML()添加自定义行为。
public class XmlToMyMessageBuilder
{
private final MyMessageBuilder protoBuilder;
public MyMessage fromXml(byte[] input()
{
protoBuilder.setXXX();
}
}
这是一个很好的编程原则。
观点2
通过提供中介,您还可以从底层序列化机制中解除代码。这允许您切换序列化程序实现(假设您要序列化有效负载,其中所有数据都是字符串格式...其中JSON序列化与压缩是一个更好的选择),影响很小。你可以做这样的事情
public interface MySerializer
{
boolean serialize(MyDomainObject input);
}
public PBBasedSerializer implements MySerializer
{
private final MyMessageBuilder protoBuilder;
...
}
public JsonBasedSerializer implements MySerializer
{
private final JSONSerializer jsonSerializer;
...
}
答案 1 :(得分:3)
这意味着您将实现自己的包含协议缓冲区对象的类作为私有字段。
协议缓冲区类是从.proto文件生成的。这些生成的类具有直接操作它们包含的字段的所有方法。但他们没有提供更高级别操作的方法,而不仅仅是修改字段。
然后,您的包装器类可以为API用户提供更丰富或更受限制的界面。由于协议缓冲区的任何修改都需要通过包装对象,因此您可以完全控制要支持的操作。
答案 2 :(得分:-1)
它说要包装创建的类是什么意思?
他们正在给你上课,把它包装成为你正在做的事情而建的儿童课。不要与库中的原始类实例进行交互。