Java序列化与协议缓冲区的使用

9
我想在Java应用程序中使用protobuff来方便序列化,我有一个关于Google网站上引用的问题。
协议缓冲区类基本上是愚蠢的数据持有者(就像C ++中的结构体); 它们不适合作为对象模型中的第一类公民。 如果要向生成的类添加更丰富的行为,则最好的方法是将生成的协议缓冲区类包装在应用程序特定类中。 如果您无法控制.proto文件的设计(例如,您正在从另一个项目中重用文件),则包装协议缓冲区也是一个好主意。 在这种情况下,您可以使用包装器类来创建更适合应用程序独特环境的接口:隐藏某些数据和方法,公开便捷函数等。 您永远不应通过继承它们来向生成的类添加行为。 这将破坏内部机制,并且不是良好的面向对象实践。

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

当说要包装创建的类时,这是什么意思?


请查看设计模式包装器,也称适配器 http://en.wikipedia.org/wiki/Adapter_pattern - none
3个回答

13

观点1

你编写一个.proto文件并将其提供给protoc生成Builder代码。他们建议不要在生成的代码中添加任何方法。如果您确实想要向生成的代码添加一些自定义行为,那么请编写一个包装生成的代码的自己的类。

例如,假设protoc生成的类是MyMessageBuilder,并且您想添加一个方法来接受XML输入并输出特定于protobuf的消息。您可以编写以下XmlToMyMessageBuilder类。在这里,XmlToMyMessageBuilder类包装了生成的代码并添加了自定义行为fromXml()。

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;
    ...
}

3
这意味着您需要实现自己的类,其中包含一个protocol buffer对象作为私有字段。
Protocol buffer类是从.proto文件生成的。这些生成的类具有直接操作它们所包含字段的所有方法。但是,它们没有提供除修改字段以外的更高级别操作的方法。
您的包装类可以为API用户提供更丰富或更受限制的接口。由于任何对protocol buffer的修改都需要通过包装对象进行,因此您可以完全控制要支持哪些操作。

生成的消息是不可变的,所以我们不能更改字段,对吧? - Kostia Dombrovsky
如果您想修改内容,请使用构建器。 - MForster

-1
当说要包装创建的类时,这是什么意思?
他们正在交给你一个类,请使用专门为你所做的事情构建的子类来包装它。不要与库中的原始类实例进行交互。

@Bill:我不同意你的观点。Master Wu的回答实际上都非常有深度和话题性,而且十分有趣。他们将编程视为禅艺,而不是在SO上经常出现的“给我代码”类型的问法。 - abelenky
2
@abelenky:很多人持不同意见。我删除的所有答案实际上都没有回答问题。我们在SO上有比“娱乐”更高的标准。如果只是一个或两个答案,可能会通过,但这真的不是一个毫无意义的新奇账户的地方。 - Bill the Lizard
2
@abelenky:另外,请随意标记“wahts teh codez?”风格的问题以便删除。 - Bill the Lizard

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接