首页 > 代码库 > Google 的Protobuf 的使用方式(序列化和反序列化工具-编解码)

Google 的Protobuf 的使用方式(序列化和反序列化工具-编解码)

1.google的protobuf是什么?

用于rpc的自定义协议,体积更小,序列化和反序列化的第三方库,和apache thrift是同一种技术。

 

2.rpc库的介绍?

(1) RMI    remote  method  invocation  

广泛用于EJB,实际上是一种跨机器的调用,通过网络传输,调用方A调用序列化字节码传输到B机器反序列化,调用B的方法,B回传结果后序列化网路传输,A反序列化成最终结果。

限制 : 只针对于Java语言。

特点 :网络传输代码自动生成   client --> stub (桩)    , server --->skeleton(骨架)

传输机制:序列化和反序列化 也叫做 :编码与解码

 

(2)RPC  remote procedure call  远程过程调用

特点: 服务端和客户端代码可跨语言 实现

编写模式 : 

[1]定义一个接口说明文件:描述了一个对象(结构体),对象成员,接口方法等一系列信息。

[2]通过RPC框架所提供的编译器,将接口说明文件编译成具体语言文件。

[3]客户端和服务器端分别引入编译器所生成的文件,即可像调用本地方法一样调用远程方法。

RPC效率决定因素:编解码速度,数据压缩程度    ,基于Socket效率高 (webservice采用http性能不如Socket)

 

3.ProtoBuf介绍?

全称:Protocol Buffers

支持的语言越多,拥有的数据类型越少,因为数据类型必须是所有语言的交集。

message消息定义:

1 message Person {
2   required string name = 1; -- 12,3是表示参数的顺序而不是默认值
3   required int32 id = 2;
4   optional string email = 3;
5 }

编码-序列化:

1 Person john = Person.newBuilder()
2     .setId(1234)
3     .setName("John Doe")
4     .setEmail("jdoe@example.com")
5     .build();
6 output = new FileOutputStream(args[0]);
7 john.writeTo(output);

解码-反序列化:

//C++语言解码
Person john = Person.newBuilder()
    .setId(1234)
    .setName("John Doe")
    .setEmail("jdoe@example.com")
    .build();
output = new FileOutputStream(args[0]);
john.writeTo(output);

netty中使用的protobuf的gradle依赖:

 1 group ‘com.netty‘
 2 version ‘1.0-SNAPSHOT‘
 3 
 4 apply plugin: ‘java‘
 5 
 6 sourceCompatibility = 1.8
 7 targetCompatibility = 1.8
 8 
 9 repositories {
10     mavenCentral()  //中央库
11 }
12 
13 dependencies {
14 //    testCompile group: ‘junit‘, name: ‘junit‘, version: ‘4.12‘
15 //    testCompile("junit:junit:4.12")
16 
17     //netty全部jar包
18     compile(
19             "io.netty:netty-all:4.1.10.Final",
20             //proobuf的包
21             "com.google.protobuf:protobuf-parent:3.3.1",
22             "com.google.protobuf:protobuf-java-util:3.3.1"
23     )
24 
25 }

tips:google protobuf 的升级版 gRPC 

 

Google 的Protobuf 的使用方式(序列化和反序列化工具-编解码)