protobuf 学习总结

本文介绍了Google的Protocol Buffers(protobuf),它是独立于语言和平台的二进制数据交换格式。protobuf提供了Java、C++和Python的实现,常用于网络通信、配置文件和数据存储。其优点包括高效的数据传输、序列化和反序列化速度,以及节省存储空间。然而,protobuf的局限在于仅适用于内部系统,对象结构有限制。此外,还对比了protobuf与thrift、JSON、XML和二进制的区别,并通过一个'Hello World'示例展示了protobuf的使用流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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.youkuaiyun.com/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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值