学习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);
		}
	}

}

 

posted on 2017-10-23 18:15  脆皮软心  阅读(300)  评论(0)    收藏  举报