Google Protocal Buffer 是一种轻便高效结构化数据存储格式,可以用于结构化数据串行化或者说序列化。它很适合做数据存储或RPC数据交换格式。

串行化(序列化):将对象存储到解释中式以二进制方式通过网络传输。之后可以通过反串行化从这些联系的字节数据重新构建一个与袁术对象状态相同的对像。

RPC:Remote Procedure Call Protocal--(RFC-1831)远过程调用协议

Protobuf的优点

  Protobuf有如xml,不过它更小,更快更简单。你可以自己定义自己的数据结构,然后使用代码生成器生成代码赖读写这个数据结构。你甚至可以再无需重新部署程序的情况下根性数据结构。秩序使用Protobuf对数据结构进行一次描述,即可以利用各种不同语言或者各种不同数据流中对你的结构化数据轻松读写。

  它还有一个非常棒的特性,即“向后”兼容性好,人们不必破坏已部署的、依靠老数据格式的程序就可以对数据结构进行升级。这样你的程序就可以不必担心因为消息结构的改变而造成大规模的代码重构或者前一问题。因为添加新的消息中的field并不会引起已经发布的程序的任何修改。

  Protobuf语义更清晰,无需类似xml解析器的东西(因为Protobuf编译器会将.proto文件编译生成对应的数据访问类以对数据进行序列化和反序列化操作)。

  使用Protobuf无需学习复杂的文档对象模型,Protobuf的编程模式比较友好,简单易学,同时它拥有良好的文档和示例,对于喜欢简单事物的人们而言,Protobuf比其他技术更加有吸引力

Protobuf的缺点

   Protobuf与XML相比,它功能简单,无法用来表示复杂的概念 XML已经成为多种行业的标准编写工具,Protobuf只是Google公司内部使用的工具,在通用性上还差很多。 由于文本并不适合用来描述数据结构,所以Protobuf也不适合用来对基于文本的标记文档(HTML)建模。另外,由于XML具有某种程度上的自解释性,它可以被人直接读取编辑,在这一点上Protobuf不行,它以二进制的方式存储,除非你有.proto定义,否则你没法直接读出 Protocol Buffer可以很好的支持嵌套Message和引入Message,从而让定义复杂的数据结构的工作变得非常轻松愉快。

动态编译:

   一般情况下,使用Protobuf的人们都会先写好.proto文件,再用Protobuf编译器生成膜表语言所需要的源代码文件。将这些生成的代码和应用程序一起编译。

  可是在某些情况下,人马无法预先知道.proto文件,需要动态处理一些位置的.proto文件。这需要动态编译.proto文件,并使用其中的Message.

  Protobuf提供了google::protobuf::compiler包赖完成动态编译的功能。主要的类叫做importer,定义在importer.h中。 import类对象中包含三个主要的对象,分别为处理错误的MultiFileErrorCollector类,定义.proto文件源目录的SourceTree类

posted on 2014-12-15 16:21  Vennet  阅读(472)  评论(0编辑  收藏  举报