关于protobuf的理论性简介可以看一下:http://blog.csdn.net/caisini_vc/article/details/5599468
那我来个简单的介绍,首先它是一个牛X的东西,谷歌推出的开源项目。它的作用是传递序列化数据用的。我们知道,在网络上或本地用于格式传输,大家可以用xml或json。
那protobuf的直接优点是:相较于xml字符冗余比较OK,写过IM通信的人会有深刻感受,使用基于xml的xmpp协议,%70的流量都是xml格式符;相较于json,又有良好的扩展性,我们知道xml一定是比json扩展性强的!
总结一下,protobuf具有良好的扩展性和不会有太多的格式标示符占用序列化空间,另外解析速度上也要有优势!缺点是可读性差,xml和json具有良好的可读性,但protobuf是采用二进制进行编码,需要序列化成对象后,查看其内容。
在实际的项目中,已经有上百万用户的APP应用采用protobuf,并成功验证OK
实例很简单:
1.编辑一个proto文件,取名叫User.proto
package protobuf;
option java_package = "com.poxiao.protobuf";
option java_outer_classname = "UserProtobuf";
message userBuf {
required int32 ID = 1;
required string Url = 2;
required bool IsSD = 3;
}
2.使用protoc.exe生成上面编辑格式的java对应文件
命令(到所在文件目录执行哦) protoc.exe --java_out=./ User.proto
执行完成后,如果什么都没显示并且所在文件夹下多出一个以我们的包名“com.poxiao.protobuf”,为目录结构的文件夹就证明,这步我们执行OK
3.上java代码,放在main方法里
// 序列化过程
// UserProtobuf是生成类的名字,即proto文件中的java_outer_classname
// userBuf是里面某个序列的名字,即proto文件中的message testBuf
UserProtobuf.userBuf.Builder builder = UserProtobuf.userBuf.newBuilder();
builder.setID(777);
builder.setUrl("shiqi");
builder.setIsSD(true);
// testBuf
UserProtobuf.userBuf info = builder.build();
byte[] result = info.toByteArray();
// 反序列化过程
try {
UserProtobuf.userBuf testBuf = UserProtobuf.userBuf.parseFrom(result);
System.out.println(testBuf);
} catch (InvalidProtocolBufferException e) {
e.printStackTrace();
}
结果输出:
ID: 777
Url: "shiqi"
IsSD: true
4.需要用的工具protoc.exe ,protobuf-java-2.4.1.jar 下载地址(不收费哦):
http://download.csdn.net/detail/feixue1232/9148063