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
- protobuf-c学习总结
- protobuf 学习总结
- protobuf-c的学习总结
- protobuf-c的学习总结
- Protobuf总结
- Protobuf 总结
- protobuf学习
- protobuf 学习
- protobuf学习
- Protobuf学习
- Protobuf学习
- Protobuf学习
- protobuf使用错误总结
- protobuf问题总结
- protobuf用法总结
- Protobuf 3.3 使用总结
- google protobuf 学习
- google protobuf学习
- jQuery计算时间差和阴阳历转换
- Rsyslog配置文件详解
- Dynamics CRM2013 用户进入系统所必需的那些权限
- hdoj--5532--Almost Sorted Array(正反LIS)
- [linux系统] kickstart配置文件ks.cfg详解
- protobuf 学习总结
- Python编程的例子----股票数据接口
- 菜鸟探究Swift中!与?的神秘
- 算法设计题3.20-栈和队列-第3章-《数据结构习题集》-严蔚敏吴伟民版
- 设置Launch Image 启动图片
- Linux 进程间通信 socket
- Unity 使用自定义资源(.asset)配置数据
- Logger.getLogger()和LogFactory.getLog()的区别
- 逆向常用的函数