带协议缓冲区的Java序列化

Mag*_*ero 6 java serialization protocol-buffers

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

协议缓冲区和OO设计协议缓冲区类基本上是哑数据持有者(如C++中的结构); 他们没有在对象模型中成为优秀的一等公民.如果要为生成的类添加更丰富的行为,最好的方法是将生成的协议缓冲区类包装在特定于应用程序的类中.如果您无法控制.proto文件的设计(例如,如果您正在重用另一个项目中的一个),那么包装协议缓冲区也是一个好主意.在这种情况下,您可以使用包装器类来创建更适合应用程序的独特环境的接口:隐藏一些数据和方法,公开便利功能等.您永远不应该通过继承它们来向生成的类添加行为.

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

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

Ara*_*ram 11

观点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();
    }
}
Run Code Online (Sandbox Code Playgroud)

这是一个很好的编程原则.

观点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;
    ...
}
Run Code Online (Sandbox Code Playgroud)