Google Protobuf
RMI: remote method invocation,只针对Java
client: stub
server:skeleton
序列化与反序列化 也叫做:编码与解码
RPC: remote procedure call,远程过程调用,很多RPC框架都是跨语言的。
关于RPC的通常做法:
1.定义一个接口说明文件:描述了对象(结构体)、对象成员、接口方法等一系列信息。
2.通过RPC框架所提供的编译器,将接口说明文件编译成具体语言文件。
3.在客户端与服务端分别引入RPC编译器所生成的文件,即可像调用本地方法一样调用远程方法。
rpc之间使用socket, webservice一般使用http。
Google Protobuf是一个开源的用于处理序列化的框架。
1.下载Protobuf编译器
https://github.com/google/protobuf/releases
选中的才是,根据自己情况选择版本。
2.可以将protobuf配置到系统环境变量中。
3.试着生成一个proto文件,以.proto后缀。在Idea中创建一个proto文件。
如图,在src下创建一个protobuf目录,然后创建Student.proto文件:
syntax = "proto2";
package com.dongqiang.protobuf;
option optimize_for = SPEED;
option java_package = "com.dongqiang.protobuf";
option java_outer_classname = "DataInfo";
message Student {
required string name = 1;
required int32 age = 2;
optional string address = 3;
}
ProtoBuf的文档在如下地址:
https://developers.google.com/protocol-buffers/docs/javatutorial
需要科学上网。编辑好文件之后,可以在命令行中键入如下命令:然后会在protobuf目录下生成以DataInfo命名的Java文件。该文件为工具自动生成的,有点类似Android中的AIDL。
$ protoc --java_out=./java/ ./proto/helloworld.proto
protoc 的命令格式为 protoc [OPTION] PROTO_FILES (最后是待编译的 proto文件)
--java_out 为输出java代码的目录,这里指定的是 ./java/ 目录。
随后我们指定了proto文件的位置 ./proto/helloworld.proto 。
执行上述命令,我们就在./java/ 目录下就产生了对应的 java文件。
可以看到在目录protobuf目录下生成了DataInfo文件。
写一个测试demo,来模拟一下这种序列化与反序列化操作:
package com.dongqiang.protobuf;
/**
* Created by dongqiang on 2017/6/22.
*/
public class ProtobufTest {
public static void main(String[] args) throws Exception {
DataInfo.Student student = DataInfo.Student.newBuilder()
.setName("zhangsan").setAge(21).setAddress("北京").build();
byte[] stu = student.toByteArray();
DataInfo.Student s = DataInfo.Student.parseFrom(stu);
System.out.println(s.getName());
System.out.println(s.getAge());
System.out.println(s.getAddress());
}
}
这里没有经过网络传输,直接通过Protobuf将对象转化为字节序列,然后再使用Protobuf将字节序列反序列化还原为对象。