带协议缓冲区的Java序列化
我想在Java应用程序中使用protobuff来促进序列化,我对Google网站上的这句话有一个疑问 协议缓冲区与O-O设计 协议缓冲区类基本上是 哑数据保持器(如中的结构) C++);他们不适合坐头等舱 对象模型中的公民。如果你 想要给一个更丰富的行为 生成类,最好的方式做 这是为了包装生成的协议 缓冲区中的缓冲区类 特定于应用程序的类。包装 协议缓冲区也是一个好主意 如果你不能控制整个世界 .proto文件的设计(例如, 你在重复使用另一个 项目)。在这种情况下,您可以使用 包装器类来制作一个 界面更适合于独特的 应用程序的环境: 隐藏某些数据和方法,公开 方便功能等。您应该 切勿将行为添加到生成的 类的继承。这 将打破内部机制,并且 不是很好的面向对象实践 无论如何 发件人:带协议缓冲区的Java序列化,java,serialization,protocol-buffers,Java,Serialization,Protocol Buffers,我想在Java应用程序中使用protobuff来促进序列化,我对Google网站上的这句话有一个疑问 协议缓冲区与O-O设计 协议缓冲区类基本上是 哑数据保持器(如中的结构) C++);他们不适合坐头等舱 对象模型中的公民。如果你 想要给一个更丰富的行为 生成类,最好的方式做 这是为了包装生成的协议 缓冲区中的缓冲区类 特定于应用程序的类。包装 协议缓冲区也是一个好主意 如果你不能控制整个世界 .proto文件的设计(例如, 你在重复使用另一个 项目)。在这种情况下,您可以使用 包装器类来制作一
当它说包装所创建的类时意味着什么 透视图1 您可以编写一个.proto文件,并将其交给protoc,由protoc生成生成器代码。他们建议不要在生成的代码中添加任何方法。如果您希望在生成的代码中添加一些自定义行为,那么就编写自己的类来包装生成的代码 例如,让我们假设protoc生成的类是MyMessageBuilder。您想添加一个方法,该方法可以接受XML输入并输出特定于protobuff的消息。您可以编写一个XmlToMyMessageBuilder,如下所示。这里是XmlToMyMessageBuilder,您的类正在包装生成的代码并从XML()添加自定义行为 这是一个很好的编程原理 透视图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;
...
}
当它说包装所创建的类时意味着什么
他们交给你一门课,用专门为你所做的事情而设计的儿童课程来包装它。不要与库中的原始类实例交互。这意味着您将实现自己的类,该类包含一个协议缓冲区对象作为私有字段 协议缓冲区类是从.proto文件生成的。这些生成的类具有所有方法来直接操作它们包含的字段。但是他们没有比仅仅修改字段更高级别操作的方法
然后,包装器类可以为API用户提供更丰富或更受限的接口。由于对协议缓冲区的任何修改都需要经过包装对象,因此您可以完全控制要支持的操作。请看设计模式包装器,即adapter@Bill:I对象。吴大师的回答其实都很有见地,很有话题性。(以及娱乐)他们将编程视为一门禅宗艺术(理应如此),而不是经常发生的“wahts teh codez?”。@阿贝伦基:很多人不同意。我删除的答案实际上都没有回答一个问题。我们有一个更高的标准,不仅仅是“娱乐”,所以在这里。如果只是一个或两个答案,它可能已经飞了,但这真的不是一个没有用途的新奇帐户的地方。@abelenky:另外,请随意标记“wahts teh codez?”样式的问题以供删除。生成的消息是不可变的,因此我们不能更改字段,我们可以吗?如果您想修改内容,请使用生成器。
public interface MySerializer
{
boolean serialize(MyDomainObject input);
}
public PBBasedSerializer implements MySerializer
{
private final MyMessageBuilder protoBuilder;
...
}
public JsonBasedSerializer implements MySerializer
{
private final JSONSerializer jsonSerializer;
...
}