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将字节序列反序列化还原为对象。

results matching ""

    No results matching ""