Chinaunix首页 | 论坛 | 博客
  • 博客访问: 5119014
  • 博文数量: 921
  • 博客积分: 16037
  • 博客等级: 上将
  • 技术积分: 8469
  • 用 户 组: 普通用户
  • 注册时间: 2006-04-05 02:08
文章分类

全部博文(921)

文章存档

2020年(1)

2019年(3)

2018年(3)

2017年(6)

2016年(47)

2015年(72)

2014年(25)

2013年(72)

2012年(125)

2011年(182)

2010年(42)

2009年(14)

2008年(85)

2007年(89)

2006年(155)

分类: Erlang

2014-12-26 15:37:50

protobuf是google的一个序列化框架,类似XML,JSON,其特点是基于二进制,比XML表示同样一段内容要短小得多,还可以定义一些可选字段,广泛用于服务端与客户端通信。文章将着重介绍在erlang中如何使用protobuf。

首先google没有提供对erlang语言的直接支持,所以这里使用到的第三方的protobuf库()

定义一个protobuf结构,保存为test.proto,如下:

  1. message Person {
  2.   required int32 age = 1;
  3.   required string name = 2;
  4. }

  5. message Family {
  6.   repeated Person person = 1;
  7. }
编译这个protobuf结构,生成相应的erlang代码:

  1. % 生成相应的erl和hrl文件
  2. protobuffs_compile:scan_file_src("test.proto").

  3. % 生成相应的beam和hrl文件
  4. protobuffs_compile:scan_file("test.proto").
下面我们以例子简单说明如何使用:


  1. -module(test).

  2. -compile([export_all]).

  3. -include("test_pb.hrl").

  4. encode() ->
  5.     Person = #person{age=25, name="John"},
  6.     test_pb:encode_person(Person).

  7. decode() ->
  8.     Data = encode(),
  9.     test_pb:decode_person(Data).

  10. encode_repeat() ->
  11.     RepeatData =
  12.     [
  13.         #person{age=25, name="John"},
  14.         #person{age=23, name="Lucy"},
  15.         #person{age=2, name="Tony"}
  16.     ],
  17.     Family = #family{person=RepeatData},
  18.     test_pb:encode_family(Family).
  19.     
  20. decode_repeat() ->
  21.     Data = encode_repeat(),
  22.     test_pb:decode_family(Data).
运行代码,如下:


  1. 6> c(test).
  2. {ok,test}
  3. 7> test:encode().
  4. <<8,25,18,4,74,111,104,110>>
  5. 8> test:decode().
  6. {person,25,"John"}
  7. 9> test:encode_repeat().
  8. <<10,8,8,25,18,4,74,111,104,110,10,8,8,23,18,4,76,117,99,
  9. 121,10,8,8,2,18,4,84,111,110,...>>
  10. 10> test:decode_repeat().
  11. {family,[{person,25,"John"},
  12. {person,23,"Lucy"},
  13. {person,2,"Tony"}]}

文章完整例子下载:原文链接




阅读(2180) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~