protobuf 学习总结

来源:互联网 发布:司法拍卖淘宝网怎么进 编辑:程序博客网 时间:2024/06/07 22:20

1 google protocol buffer

1.1  Definition

1.1.1  google开发的二进制的数据交换格式,独立于语言,独立于平台

1.1.2  提供了三种语言的实现,java、c++、Python

1.2  Function

1.2.1  用于分布式应用之间的数据通信或者异构环境下的数据交换

1.2.2 常用于网络传输、配置文件、数据存储等领域

1.3 Advantage

1.3.1 protobuf advantage

1.3.1.1 数据传输效率高

1.3.1.2 支持java、c++、Python,序列化和反序列化效率高

1.3.1.3 相比json、xml而言,节省消息空间

1.3.1.4 简单易用,可以按照一定语法定义消息格式,然后使用protoc命令行工具生成相应类

1.3.2 protobuf disadvantage

1.3.2.1 对象结构体有限制,只适用于内部系统

1.3.3 protobuf & thrift &json &xml &binary

1.3.3.1 thrift

1、2007年Facebook开发的跨语言的轻量级RPC消息和数据交换框架

2、能生成多种语言,C++, Java,Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, Smalltalk, OCaml

3、较protobuf而言,thrift功能丰富,支持语言多,资料少,学习成本高

2 Hello World之protobuf

2.1 reference

http://blog.csdn.net/luyee2010/article/details/8206090

2.2 project structure

2.3 编写.proto文件

msg.proto

option java_package = "com.protobuftest.protobuf";

option java_outer_classname = "PersonProbuf";

 

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;

 

  message CountryInfo {

          required string name = 1;

          required string code = 2;

          optional int32 number = 3;

  }

}

 

message AddressBook {

  repeated Person person = 1;

}

2.4 protoc工具生成java bean

在proto.exe目录下执行命令:protoc –java_out=./src ./proto/msg.proto

2.5 使用java bean

TestProtobuf.java

package com.protobuftest.protobuf;

 

import java.util.List;

 

import com.google.protobuf.InvalidProtocolBufferException;

import com.protobuftest.protobuf.PersonProbuf;

import com.protobuftest.protobuf.PersonProbuf.Person;

import com.protobuftest.protobuf.PersonProbuf.Person.PhoneNumber;

 

public class TestProtobuf {

         /**

          * @param args

          */

         public static void main(String[] args) {

                   // TODO Auto-generated method stub

                   PersonProbuf.Person.Builder builder = PersonProbuf.Person.newBuilder();

                   builder.setEmail("kkk@email.com");

                   builder.setId(1);

                   builder.setName("TestName");

                  builder.addPhone(PersonProbuf.Person.PhoneNumber.newBuilder().setNumber("131111111")

                                     .setType(PersonProbuf.Person.PhoneType.MOBILE));

                  builder.addPhone(PersonProbuf.Person.PhoneNumber.newBuilder().setNumber("011111")

                                     .setType(PersonProbuf.Person.PhoneType.HOME));

                   Person person = builder.build();

                   byte[] buf = person.toByteArray();

                   try {

                            Person person2 = PersonProbuf.Person.parseFrom(buf);

                            System.out.println(person2.getName() + ", " + person2.getEmail());

                            List<PhoneNumber> lstPhones = person2.getPhoneList();

                            for (PhoneNumber phoneNumber : lstPhones) {

                                     System.out.println(phoneNumber.getNumber());

                            }

                   } catch (InvalidProtocolBufferException e) {

                            // TODO Auto-generated catch block

                            e.printStackTrace();

                   }

                   System.out.println(buf);

         }

}

3 protobuf data type


0 0
原创粉丝点击