protobuffer序列化

一. 描述对象的proto文件

  1. 第一行package:对象经过protobuffer编译后形成java文件,这个文件放在按照package新建的文件夹内
  2. java_package:java类的包名
  3. java_outer_classname:java文件名,也是public class的名字
  4. message定义内部类Person,Person也是要序列化的类
  5. required表示该字段是必须字段,optional是可选字段
  6. repeated根据不同的消息类型解析数据包内的字段,用于自定义的类,数组等
    package  com.lj;
    option java_package="com.lj";
    option java_outer_classname="MyPerson";
    
    message Person{
      required string name=1;
      required int32 id=2;
      optional string email=3;
    
      message PhoneNumber{
        required string number=1;
        optional int32 type=2;
      }
    
      repeated PhoneNumber phoneNumber=4;
    }
    
    

二. 编译描述文件

protoc --proto_path=IMPORT_PATH --java_out=DST_DIR file.proto

三. 序列化与反序列化代码

  1. new Builder().build()方法创建序列化
  2. parseFrom()反序列化
    public class TestProtocalBuffer {
    	/**
    	* protobuffer序列化 : 1.编写proto文件描述bean 2.命令生成代码 3.java代码调用
    	* @param args
    	* @throws IOException
    	*/
    	public static void main(String[] args) throws IOException {
    
    		MyPerson.Person p1 = MyPerson.Person.newBuilder()
    				.setName("lj").setId(25629).setEmail("lj72808up@163.com")
    				.addPhoneNumber(MyPerson.Person.PhoneNumber.newBuilder().setNumber("13905723516").setType(1)).build();
    
    		FileOutputStream os = new FileOutputStream("d://123.txt");
    		p1.writeTo(os);   // 把文件
    		os.close();
    
    	}
    
    	/**
    	* protobuffer读取文件反序列化成对象
    	* @throws IOException
    	*/
    	@Test
    	public void testRead() throws IOException {
    		FileInputStream is = new FileInputStream("d://123.txt");
    		MyPerson.Person person = MyPerson.Person.parseFrom(is);
    		System.out.println(person);
    	}
    	/**  name: "lj"
    		id: 25629
    		email: "lj72808up@163.com"
    		phoneNumber {
    		number: "13905723516"
    		type: 1
    		}                          **/
    }
    
    
posted @ 2016-02-26 16:55  lj72808up  阅读(491)  评论(0编辑  收藏  举报