带协议缓冲区的Java序列化

时间:2010-11-01 15:13:21

标签: java serialization protocol-buffers

我想在Java应用程序中使用protobuff来促进序列化,我对Google网站上的这句话有疑问

  

协议缓冲区和O-O设计   协议缓冲类基本上是   愚蠢的数据持有者(如结构中的结构)   C ++);他们没有做好头等舱   公民在对象模型中。如果你   想要为a添加更丰富的行为   生成类,最好的方法   这是包装生成的协议   缓冲类在   特定于应用程序的类。包皮   协议缓冲区也是一个好主意   如果你没有控制权   .proto文件的设计(如果,比方说,   你正在重复使用彼此   项目)。在这种情况下,您可以使用   用于制作的包装类   界面更适合独特   您的应用环境:   隐藏一些数据和方法,暴露   便利功能等你应该   永远不会为生成的行为添加行为   通过继承它们的类。这个   将打破内部机制,是   不善于面向对象的实践   反正。

来自:http://code.google.com/apis/protocolbuffers/docs/javatutorial.html

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

3 个答案:

答案 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)

  

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

他们正在给你上课,把它包装成为你正在做的事情而建的儿童课。不要与库中的原始类实例进行交互。