Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带协议缓冲区的Java序列化_Java_Serialization_Protocol Buffers - Fatal编程技术网

带协议缓冲区的Java序列化

带协议缓冲区的Java序列化,java,serialization,protocol-buffers,Java,Serialization,Protocol Buffers,我想在Java应用程序中使用protobuff来促进序列化,我对Google网站上的这句话有一个疑问 协议缓冲区与O-O设计 协议缓冲区类基本上是 哑数据保持器(如中的结构) C++);他们不适合坐头等舱 对象模型中的公民。如果你 想要给一个更丰富的行为 生成类,最好的方式做 这是为了包装生成的协议 缓冲区中的缓冲区类 特定于应用程序的类。包装 协议缓冲区也是一个好主意 如果你不能控制整个世界 .proto文件的设计(例如, 你在重复使用另一个 项目)。在这种情况下,您可以使用 包装器类来制作一

我想在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;
    ...
}