2010-11-01 78 views
5

我想用protobuff在Java应用程序,以方便系列化,我有一个关于从谷歌网站Java序列与协议缓冲区

协议缓冲区和面向对象设计 协议缓冲区类基本上都是这个报价问题 愚蠢的数据持有者(如结构在 C++);他们不会在一个对象模型中成为一等公民012xx公民。如果 想要为生成的类添加更丰富的行为,那么执行 的最佳方法是将生成的协议 缓冲区类包装到 应用程序特定的类中。如果您无法控制.proto文件的 设计(如果您正在重复使用另一个 项目),则协议缓冲区也是个不错的主意 。在这种情况下,你可以使用 包装类,以便起草一个 接口更适合于独特的环境 您的应用程序: 隐藏一些数据和方法,揭露 方便的功能,等等。你应该 绝不添加行为的产生 继承自它们的类。这 将打破内部机制,并且是 反正不好的面向对象的练习 。

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

是什么意思时,它说,包裹创建的类?

+0

看看设计模式包装,又名适配器http://en.wikipedia.org/wiki/Adapter_pattern – none 2010-11-01 15:42:12

回答

9

视角1

你写一个.proto文件,并给它protoc产生了Builder代码。他们建议不要在生成的代码中添加任何方法。如果您想要将一些自定义行为添加到生成的代码中,请写下您自己的类生成代码。

例如让我们说protoc生成的类是MyMessageBuilder。而且你想添加一个方法,它可以接受XML输入,并将原始特定信息吐出。你会像下面这样编写一个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

是什么意思时,它说,包裹创建的类?

他们交给你一个类,包装它与一个孩子类的目的,为你正在做的。不要与库中的原始类实例进行交互。

+0

@ Bill:我的对象。吴大师的回答都非常有见地和热门话题。 (以及娱乐性)他们将编程视为一种禅宗艺术(应该是这样),而不是“对待编码?”。这经常发生在SO上。 – abelenky 2010-11-01 20:41:49

+2

@abelenky:很多人不同意。我没有删除的答案实际上回答了一个问题。我们有更高的标准,而不仅仅是在这里的“娱乐”。如果它只是一个或两个答案,它可能会飞,但这真的不是一个没有用途的新奇账户的地方。 – 2010-11-01 20:51:09

+2

@abelenky:另外,请随时举出“wahts teh codez?”以及删除样式问题。 – 2010-11-01 20:53:53

3

这意味着您将实现自己的包含协议缓冲区对象的类作为专用字段。

协议缓冲区类是从.proto文件生成的。这些生成的类具有所有方法来直接操纵它们包含的字段。但是他们没有比修改字段更高级的操作方法。

您的包装类可以为API的用户提供更丰富或更受限制的接口。由于协议缓冲区的任何修改都需要通过包装对象,因此您可以完全控制要支持的操作。

+0

那么生成的消息是不可变的,所以我们不能改变字段,我们可以吗? – 2011-03-30 14:37:05

+0

您要修改内容,请改为使用构建器。 – MForster 2011-03-30 15:20:11