我想在 Java 应用程序中使用 protobuf 来促进序列化,并且我对 Google 网站上的这段引用有疑问
协议缓冲区和 O-O 设计
Protocol Buffer 类基本上是
哑数据持有者(如结构体
C++);他们的头等舱成绩不好
对象模型中的公民。如果你
想要添加更丰富的行为
生成的类,最好的方法
这是包装生成的协议
缓冲类中的
特定于应用程序的类。包装
协议缓冲区也是一个好主意
如果你无法控制
.proto 文件的设计(例如,
你正在重复使用另一个
项目)。在这种情况下,您可以使用
包装类来制作
界面更适合独特的
您的应用程序的环境:
隐藏一些数据和方法,暴露
便利功能等。您应该
切勿将行为添加到生成的
类通过继承它们。这
会破坏内部机制
不好的面向对象实践
反正。
from: http://code.google.com/apis/protocolbuffers/docs/javatutorial.html http://code.google.com/apis/protocolbuffers/docs/javatutorial.html
当它说包装创建的类时是什么意思?
观点1
您编写一个 .proto 文件并将其提供给生成 Builder 代码的 protoc。他们建议不要向生成的代码添加任何方法。如果您确实希望将一些自定义行为添加到生成的代码中,那么请编写您自己的类来包装生成的代码。
例如,我们假设协议生成的类是 MyMessageBuilder。您想要添加一个可以接受 XML 输入并吐出 protobuff 特定消息的方法。您将编写一个 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;
...
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)