在erlang项目中使用protobuf

http://blog.csdn.net/mycwq/article/details/21864191

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

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

https://github.com/basho/erlang_protobuffs

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

  1. enum PhoneType {

  2.   PhoneType_Home = 1;
  3. PhoneType_Company = 2;
  4. }
  5. message Person {
  6. required int32 age = 1;
  7. required string name = 2;
  8. }
  9. message Other {
  10. required PhoneType type = 1;
  11. required string phone = 2;
  12. }
  13. message Family {
  14. required int32 mainid = 1;
  15. optional Other other = 2;
  16. repeated Person person = 3;
  17. }

编译这个protobuf结构,生成相应的erlang代码:

  1. % 生成相应的erl和hrl文件
  2. protobuffs_compile:generate_source("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 = erlang:iolist_to_binary(encode()),
  9. io:format("Data is ~p~n", [Data]),
  10. test_pb:decode_person(Data).
  11. encode_repeat() ->
  12. OtherData = #other{type='PhoneType_Company', phone="028-12345678"},
  13. RepeatData =
  14. [
  15. #person{age=25, name="John"},
  16. #person{age=23, name="Lucy"},
  17. #person{age=2, name="Tony"}
  18. ],
  19. Family = #family{mainid=111, other=OtherData, person=RepeatData},
  20. test_pb:encode_family(Family).
  21. decode_repeat() ->
  22. Data = erlang:iolist_to_binary(encode_repeat()),
  23. io:format("Data is ~p~n", [Data]),
  24. %test_pb:decode_family(Data).
  25. FamilyData = test_pb:decode_family(Data),
  26. {family, _, _, PersonData} = FamilyData,
  27. io:format("~p~n", [FamilyData]),
  28. io:format("Per Len is ~w~n~n", [length(PersonData)]),
  29. parse_repeat(PersonData).
  30. parse_repeat([]) ->
  31. ok;
  32. parse_repeat([H|T]) ->
  33. if is_record(H, person) ->
  34.        io:format("age[~p],name[~p]~n", [H#person.age, H#person.name])
  35. end,
  36. parse_repeat(T).

运行代码,如下:

  1. 5> c(test_pb).
  2. {ok,test_pb}
  3. 6> c(test).
  4. {ok,test}
  5. 7> test:encode().
  6. [[["\b",[25]],[[18],[4],<<"John">>]]]
  7. 8> test:decode().
  8. Data is <<8,25,18,4,74,111,104,110>>
    {person,25,"John"}

  9. 9> test:encode_repeat().
  10. [[["\b","o"],
    [[18],[16],[[["\b",[2]],[[18],"\f",<<"028-12345678">>]]]],
    [[[26],"\b",[[["\b",[25]],[[18],[4],<<"John">>]]]],
    [[26],"\b",[[["\b",[23]],[[18],[4],<<"Lucy">>]]]],
    [[26],"\b",[[["\b",[2]],[[18],[4],<<"Tony">>]]]]]]]

  11. 10> test:decode_repeat().

    Data is <<8,111,18,16,8,2,18,12,48,50,56,45,49,50,51,52,53,54,55,56,26,8,8,25,
    18,4,74,111,104,110,26,8,8,23,18,4,76,117,99,121,26,8,8,2,18,4,84,
    111,110,121>>
    {family,111,
    {other,'PhoneType_Company',"028-12345678"},
    [{person,25,"John"},{person,23,"Lucy"},{person,2,"Tony"}]}
    Per Len is 3

    age[25],name["John"]
    age[23],name["Lucy"]
    age[2],name["Tony"]
    ok

文章完整例子下载:http://download.csdn.net/detail/cwqcwk1/7087293

在erlang项目中使用protobuf的更多相关文章

  1. Erlang 在erlang项目中使用protobuf

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

  2. 项目中使用protobuf 3.0

    protocol buffer从3.0 原生的compiler支持c++,Java,Python,Go,Ruby,JavaNano,JavaScript,Objective-C,C#,PHP这篇文章作 ...

  3. 项目中使用protobuf

    在互种系统中数据通信或数据交换可以使用protobuf,他比json.xml的数据量要小一些. 另外因为消息要单独写一个.proto文件,来生成各平台的代码,所以对跨平台通信来说也比较友好. 一.使用 ...

  4. 在java项目中使用protobuf

    1 通用方式 第一步,定义数据结构 第二步,使用protoc.exe生成java代码 第三步,序列化 第四步,反序列化 2 grpc方式 grpc官方推荐的方式,通过maven插件来生成java代码. ...

  5. 在Wcf中应用ProtoBuf替代默认的序列化器

    Google的ProtoBuf序列化器性能的牛逼已经有目共睹了,可以把它应用到Socket通讯,队列,Wcf中,身为dotnet程序员一边期待着不久后Grpc对dotnet core的支持更期待着Wc ...

  6. 【新手总结】在.Net项目中使用Redis作为缓存服务

    最近由于项目需要,在系统缓存服务部分上了redis,终于有机会在实际开发中玩一下,之前都是自己随便看看写写,很零碎也没沉淀下来什么,这次算是一个系统学习和实践过程的总结. 和Redis有关的基础知识 ...

  7. 在as3中使用protobuf

    在最近参与开发的adobe air项目中,前后端的通信协议从XML.JSON再到protobuf,最后选择protobuf原因,主要是前后端维护protobuf协议就行了,同时还可以利用IDE做一些编 ...

  8. 在Windows用Rebar来构建,编译,测试,发布Erlang项目

    rebar是一个遵循 Erlang/OTP 原则的 Erlang 项目构建工具,使用它可以减少构建标准 Erlang/OTP 项目架构配置的工作量,并且可以很容易的编译.测试.发布 Erlang 应用 ...

  9. cmake在实际复杂项目中的使用

    在实际复杂的项目之中,会有很多的源文件,以及对于库的依赖,如果直接使用makefile会比较的繁琐,而且makefile的推导规则也非常多,对多目录的支持也比较复杂. 最近看了一下cmake,发现配置 ...

随机推荐

  1. php网页跳转无法获取session值

    今日编写项目,需要在跳转后的页面获取session值进行自动登录操作,但是明明在传输页面可以打印出session值,但在接受页面却显示session值为空,经确认脚本中的session_start() ...

  2. 00092_字符输出流Writer

    1.字符输出流Writer (1)既然有专门用于读取字符的流对象,那么肯定也有写的字符流对象: (2)查阅API,发现有一个Writer类,Writer是写入字符流的抽象类.其中描述了相应的写的动作. ...

  3. 谈谈vector容器的三种遍历方法

    说明:本文仅供学习交流.转载请标明出处.欢迎转载!          vector容器是最简单的顺序容器,其用法相似于数组.实际上vector的底层实现就是採用动态数组.在编敲代码的过程中.经常会变量 ...

  4. 为什么要学习Numerical Analysis

    前几日我发了一个帖子,预告自己要研究一下  Numerical Analysis 非常多人问我为啥,我统一回答为AI-----人工智能 我在和教授聊天的时候,忽然到了语言发展上 我说:老S啊(和我关系 ...

  5. delete noprompt archivelog 报错ORA-00245,RMAN-08132

    在RMAN执行  delete noprompt archivelog until time 'sysdate-1';  报错   ORA-00245: control file backup fai ...

  6. 【Codeforces Round #301 (Div. 2) B】 School Marks

    [链接] 我是链接,点我呀:) [题意] 已知k门成绩. 总共有n门成绩. 让你构造剩下的n-k门成绩,使得这n门成绩的中位数>=y,并且这n门成绩的和要小于等于x. n为奇数 [题解] 首先判 ...

  7. struts2_7_Action类中方法的动态调用

    (一)直接调用方法(不推荐使用) 1)Action类: private String savePath; public String getSavePath() { return savePath; ...

  8. dinic算法学习(以poj1273为例)

    Dinic 算法模板  Dinic算法是一种比較easy实现的.相对照较快的最大流算法. 求最大流的本质,就是不停的寻找增广路径.直到找不到增广路径为止. 对于这个一般性的过程,Dinic算法的优化例 ...

  9. java.util.logging使用笔记2

      java.util.logging是java自带的日志处理系统,其功能不如log4j/logback强大,但可以完成基本的日志需求. 另外,如果在一个项目中使用log4j, 而这个项目引用的第3方 ...

  10. php课程 8-28 php如何绘制生成显示图片

    php课程 8-28 php如何绘制生成显示图片 一.总结 一句话总结:gd库轻松解决 1.php图片操作生成的图的两种去向是什么? 一种在页面直接输出,一种存进本地磁盘 2.php操作图片的库有哪些 ...