学习protocol http://www.jianshu.com/p/fa126a8535a0
mac安装protocbuff:
下边总结一下安装流程:
查看官方文档
源码在 https://github.com/google/protobuf , 如果不想自己编译获得最新版本,则可以下载官方编译好的各个平台的,下载地址:https://github.com/google/protobuf/releases找到自己需要的版本,例如要装2.6.1的话下载protobuf-2.6.1.zip
第一步:cd /Users/sddd/Downloads/protobuf-2.6.1
第二步:运行 ./configure
第三步:运行 make
第四步:运行 make check
第五步:运行 make install
如何没有权限的话,在前边加上sudo
到这里就可以安装成功了,具体集成到项目上可以查看转发的博客上
在终端protoc --version
使用Protoc
一;定义数据结构
编译一个proto文件:
在mywork文件夹下新建PersonMsg.proto,内容如下:
message Person {
// ID(必需)
required int32 id = 1;
// 姓名(必需)
required string name = 2;
// email(可选)
optional string email = 3;
// 朋友(集合)
repeated string friends = 4;
}
二 生成 .java文件
在命令行首先 cd mywork (cd 进入要编译的文件夹)
然后执行: protoc --plugin=mywork PersonMsg.proto --java_out="./"
则会在mywork文件夹下生成一个名为PersonMsg.java的文件(如果是c++的话cpp_out= 生成的则是。PersonMsg.h.cc文件)
在Eclipse中创建一个项目,将java文件拷贝到项目中。项目中需要引入protobuf-java-2.5.0.jar包。如果是maven项目则加入:
<dependency> <groupId>com.google.protobuf</groupId> <artifactId>protobuf-java</artifactId> <version>2.5.0</version> </dependency>
三 序列化
四 反序列化
一般来说,序列化和反序列化是分开的。例如网络传输,由一方将数据序列化后发送给另一方来接收并解析,序列化发送和接收反序列化并不在一起。但是下面为了例子简单将二者写在同一程序中。
import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.List; public class Main { public static void main(String[] args) throws IOException { // 按照定义的数据结构,创建一个Person PersonMsg.Person.Builder personBuilder = PersonMsg.Person.newBuilder(); personBuilder.setId(1); personBuilder.setName("叉叉哥"); personBuilder.setEmail("xxg@163.com"); personBuilder.addFriends("Friend A"); personBuilder.addFriends("Friend B"); PersonMsg.Person xxg = personBuilder.build(); // 将数据写到输出流,如网络输出流,这里就用ByteArrayOutputStream来代替 ByteArrayOutputStream output = new ByteArrayOutputStream(); xxg.writeTo(output); // -------------- 分割线:上面是发送方,将数据序列化后发送 --------------- byte[] byteArray = output.toByteArray(); // -------------- 分割线:下面是接收方,将数据接收后反序列化 --------------- // 接收到流并读取,如网络输入流,这里用ByteArrayInputStream来代替 ByteArrayInputStream input = new ByteArrayInputStream(byteArray); // 反序列化 PersonMsg.Person xxg2 = PersonMsg.Person.parseFrom(input); System.out.println("ID:" + xxg2.getId()); System.out.println("name:" + xxg2.getName()); System.out.println("email:" + xxg2.getEmail()); System.out.println("friend:"); List<String> friends = xxg2.getFriendsList(); for(String friend : friends) { System.out.println(friend); } } }