勤&快

问题其实就是你期望的东西和你体验的东西之间的差别
随笔 - 55, 文章 - 0, 评论 - 68, 引用 - 0
数据加载中……

试用Google Protocol Buffers

试用了google Protocol Buffers, 2.0.0 beta 版本,感觉还不错。
可以去这里下载,有linux和windows版本。
Protocol Buffers是一个平台中立,编程语言无关的,可扩展的机制,用来将数据序列化。有点类似xml,但是比xml更小更快更简单。

如何使用

1. 使用Protocol特定的简洁的描述语法,描述一个数据结构,如:
message Person {

required string name = 1;

required int32 id = 2;

optional string email = 3;

enum PhoneType {

MOBILE = 0;

HOME = 1;

WORK = 2;

}

message PhoneNumber {

required string number = 1;

optional PhoneType type = 2 [default = HOME];

}

repeated PhoneNumber phone = 4;

}

具体这个文件的语法请参考Protocol Buffer Language Guide
2. 定义后这个文件之后,保存为文件phone.proto。然后使用protocol buffer提供的命令行工具protoc,从这个文件生成制定编程语言的代码,现在支持Java, C++, 和Python。
如生成java代码的命令如下:
protoc -I=$SRC_DIR --java_out=$DST_DIR phone.proto
3. 得到生成java类,就可以进行对上面定义的结构化数据进行操作了。比如,数据结构person中的所有变量,都提供get和set方法。并且提供has方法,检查这个变量是否存在。
可以对数据进行序列化,保存到磁盘上。也可以使用Builder方法,从磁盘文件中将原有数据读出。但是序列化到磁盘中的数据是部分二进制的,不能被人直接读取。这个不如xml方便。感觉有点像IDL,或者是多语言版的JIBX,或者是单机版的openoffice的UNO。其他PB确实像很多东西,这个页面列举了一些。

应用场景

一直不是很清楚的知道这个应用场景。
也许是一些用户,要制定一个特定的数据结构,进行数据交互和共享。那么使用这个PB Language 定义一个数据结构,然后大家从这个描述文件,各自生成自己使用的编程语言对应的代码文件,再使用这些代码对硬盘中的数据进行读写。那么,只要都遵守这个数据文件格式,硬盘中的数据共享就实现了夸平台跨语言了。如果数据描述文件做了修改,只要遵守一定的规则,那么原有数据还是可以兼容使用的。这个就是做了一个平台无关的文件与平台和语言相关的数据对象之间的适配转化工作,就和很多xml解析器一样,只是这个也许更简单更易用吧。

优点

1. 定于语言体积小,支持多种数据类型,如list,支持嵌套
2. 定义过程中可以使用类型的概念,可以在使用的时候检查类型合法性
3. 可以将一个描述文件,生成多种语言的代码,使数据的读写实现了语言无关。
4. 如果描述文件修改了,只要遵守一定的规则,那原有数据结构对应的数据,也是可以被成功读取的。

缺点

1. 序列化后的文件不可读。
2. 不可与xml或者json进行相互转化

问题

在使用中发现2个问题
1. 不能加载库
在ubuntu下安装,使用如下命令
./configure
make check
make install
安装之后,运行protoc,提示找不到两个库:libprotobuf.so,libprotoc.so。原因是因为这两个库安装在了/usr/local/lib下,但是ubunut的lib路径为/usr/lib。这个可能是我事先没有制定-lib目录。不过anyway,
解决方法:
cd /usr/lib/
sudo ln -s  /usr/local/lib/libprotobuf.so.0.0.0 libprotobuf.so.0
sudo ln -s  /usr/local/lib/libprotoc.so.0.0.0 libprotoc.so.0
2. 不能正常编译给出的sample例子(java版本)。
首先进入$protobuf-2.0.0beta/java目录,运行mvn package,在protobuf-2.0.0beta/java/target目录下,得到protobuf-java-2.0.0beta.jar文件,这个文件应该放在classpath中,以便在使用protoc生成的java类。但是在sample中,并没有去将这个jar文件加如classpath中,需要手动加入。否则,运行make java,提示很多类找不到。
解决方法:
方法1.将protobuf-java-2.0.0beta.jar拷贝到系统的classpath下
方法2.将protobuf-java-2.0.0beta.jar中的类完整路径内容解压缩到$protobuf-2.0.0beta/examples中。

相关链接:
另外一篇关于protocol buffer的文章

posted on 2008-07-08 13:56 daning 阅读(5364) 评论(4)  编辑  收藏 所属分类: ubuntujava

评论

# re: 试用Google Protocol Buffers  回复  更多评论   

不错,勤快的~
转载了
2008-07-08 22:24 | 康爷

# re: 试用Google Protocol Buffers  回复  更多评论   

浠饭
2008-07-09 07:04 | Yawolf

# re: 试用Google Protocol Buffers[未登录]  回复  更多评论   

我安装c++的,怎么老是显示inf没有定义,修改后只生成了.la文件。
2008-07-22 15:04 | gavin

# re: 试用Google Protocol Buffers[未登录]  回复  更多评论   

不好意思,我只使用了java版本
2008-07-22 18:50 | daning

只有注册用户登录后才能发表评论。


网站导航: