Erlang项目中使用ProtoBuf

Erlang项目中使用ProtoBuf

0.前言

Protobuf是Google的一个序列化框架,类似于XML、Json,特点是基于二进制。Google实现了基于C++、C#、Java、Pathon、Go等语言,ProtoBuf官网。

Google没有提供对Erlang语言支持的ProtoBuf实现,所以我们引入第三方Erlang语言的Probuf库(https://github.com/tomas-abrahamsson/gpb)。

1.Protobuf安装与编译(Linux环境)

  1. 从GitHub上下载源代码:git clone https://github.com/tomas-abrahamsson/gpb
  2. 进入目录:cd gpb
  3. 编译:make

2.基础测试用例

  1. 创建proto文件:test.proto

    message Person {
      required string name = 1;
      required int32 id = 2;
      optional string email = 3;
    }
    
  2. 执行生成test.erl、test.hrl、test.beam,编译test.erl

    ../gpb/bin/protoc-erl -I. test.proto
    erlc -I../gpb/include test.erl
    # erl
    Erlang/OTP 19 [erts-8.0.3] [source] [64-bit] [smp:12:12] [async-threads:10] [kernel-poll:false]
    
    Eshell V8.0.3  (abort with ^G)
    1> rr("test.hrl").
    ['Person']
    2> test:encode_msg(#'Person'{name="abc def", id=345, email="[email protected]"}).    
    <<10,7,97,98,99,32,100,101,102,16,217,2,26,13,97,64,101,
      120,97,109,112,108,101,46,99,111,109>>
    3> Bin = v(-1).
    <<10,7,97,98,99,32,100,101,102,16,217,2,26,13,97,64,101,
      120,97,109,112,108,101,46,99,111,109>>
    4> test:decode_msg(Bin, 'Person').
    #'Person'{name = "abc def",id = 345,email = "[email protected]"}
    

    可以看到以上结果,基础测试成功。接下来是要移植到你的自己的项目中。

3.Protobuf集成到Erlang项目

  1. 引入Protobuf库进入自己的Erlang项目。
    rebar3:Rebar 是功能丰富的 Erlang 构建工具。用于Erlang/OTP项目的编译,测试,依赖管理,打包发布等。(使用rabar3首先在Linux上安装rebar3)。
    然后在项目reabr.config文件中加入Protobuf依赖,我这里使用的是第三方的ProtoBuf库GPB,引入依赖如下:
{deps, [{gpb, ".*", {git, "https://github.com/tomas-abrahamsson/gpb.git", {branch, "master"}}}]}.
  1. 在GPB库目录下,根据自己的model.protobuf文件,生成对应的model.erl、model.hrl、model.deam文件(基本操作流程参考基础测试用例)。然后将生成的model.erl的文件复制到我们的工程 src目录下,model.erl是我们进行序列化编码需要的。
  2. 然后将model.erl import进我们的项目中,就可以调用其encode_msg()、decode_msg()方法了。

你可能感兴趣的:(Erlang,erlang,ProtoBuf,GPB,encode)