在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,如下:
enum PhoneType {
- PhoneType_Home = 1;
- PhoneType_Company = 2;
- }
- message Person {
- required int32 age = 1;
- required string name = 2;
- }
- message Other {
- required PhoneType type = 1;
- required string phone = 2;
- }
- message Family {
- required int32 mainid = 1;
- optional Other other = 2;
- repeated Person person = 3;
- }
编译这个protobuf结构,生成相应的erlang代码:
- % 生成相应的erl和hrl文件
- protobuffs_compile:generate_source("test.proto").
- % 生成相应的beam和hrl文件
- protobuffs_compile:scan_file("test.proto").
下面我们以例子简单说明如何使用:
- -module(test).
- -compile([export_all]).
- -include("test_pb.hrl").
- encode() ->
- Person = #person{age=25, name="John"},
- test_pb:encode_person(Person).
- decode() ->
- Data = erlang:iolist_to_binary(encode()),
- io:format("Data is ~p~n", [Data]),
- test_pb:decode_person(Data).
- encode_repeat() ->
- OtherData = #other{type='PhoneType_Company', phone="028-12345678"},
- RepeatData =
- [
- #person{age=25, name="John"},
- #person{age=23, name="Lucy"},
- #person{age=2, name="Tony"}
- ],
- Family = #family{mainid=111, other=OtherData, person=RepeatData},
- test_pb:encode_family(Family).
- decode_repeat() ->
- Data = erlang:iolist_to_binary(encode_repeat()),
- io:format("Data is ~p~n", [Data]),
- %test_pb:decode_family(Data).
- FamilyData = test_pb:decode_family(Data),
- {family, _, _, PersonData} = FamilyData,
- io:format("~p~n", [FamilyData]),
- io:format("Per Len is ~w~n~n", [length(PersonData)]),
- parse_repeat(PersonData).
- parse_repeat([]) ->
- ok;
- parse_repeat([H|T]) ->
- if is_record(H, person) ->
- io:format("age[~p],name[~p]~n", [H#person.age, H#person.name])
- end,
- parse_repeat(T).
运行代码,如下:
- 5> c(test_pb).
- {ok,test_pb}
- 6> c(test).
- {ok,test}
- 7> test:encode().
- [[["\b",[25]],[[18],[4],<<"John">>]]]
- 8> test:decode().
Data is <<8,25,18,4,74,111,104,110>>
{person,25,"John"}- 9> test:encode_repeat().
[[["\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">>]]]]]]]- 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 3age[25],name["John"]
age[23],name["Lucy"]
age[2],name["Tony"]
ok
文章完整例子下载:http://download.csdn.net/detail/cwqcwk1/7087293
在erlang项目中使用protobuf的更多相关文章
- Erlang 在erlang项目中使用protobuf
protobuf是google的一个序列化框架,类似XML,JSON,其特点是基于二进制,比XML表示同样一段内容要短小得多,还可以定义一些可选字段,广泛用于服务端与客户端通信.文章将着重介绍在erl ...
- 项目中使用protobuf 3.0
protocol buffer从3.0 原生的compiler支持c++,Java,Python,Go,Ruby,JavaNano,JavaScript,Objective-C,C#,PHP这篇文章作 ...
- 项目中使用protobuf
在互种系统中数据通信或数据交换可以使用protobuf,他比json.xml的数据量要小一些. 另外因为消息要单独写一个.proto文件,来生成各平台的代码,所以对跨平台通信来说也比较友好. 一.使用 ...
- 在java项目中使用protobuf
1 通用方式 第一步,定义数据结构 第二步,使用protoc.exe生成java代码 第三步,序列化 第四步,反序列化 2 grpc方式 grpc官方推荐的方式,通过maven插件来生成java代码. ...
- 在Wcf中应用ProtoBuf替代默认的序列化器
Google的ProtoBuf序列化器性能的牛逼已经有目共睹了,可以把它应用到Socket通讯,队列,Wcf中,身为dotnet程序员一边期待着不久后Grpc对dotnet core的支持更期待着Wc ...
- 【新手总结】在.Net项目中使用Redis作为缓存服务
最近由于项目需要,在系统缓存服务部分上了redis,终于有机会在实际开发中玩一下,之前都是自己随便看看写写,很零碎也没沉淀下来什么,这次算是一个系统学习和实践过程的总结. 和Redis有关的基础知识 ...
- 在as3中使用protobuf
在最近参与开发的adobe air项目中,前后端的通信协议从XML.JSON再到protobuf,最后选择protobuf原因,主要是前后端维护protobuf协议就行了,同时还可以利用IDE做一些编 ...
- 在Windows用Rebar来构建,编译,测试,发布Erlang项目
rebar是一个遵循 Erlang/OTP 原则的 Erlang 项目构建工具,使用它可以减少构建标准 Erlang/OTP 项目架构配置的工作量,并且可以很容易的编译.测试.发布 Erlang 应用 ...
- cmake在实际复杂项目中的使用
在实际复杂的项目之中,会有很多的源文件,以及对于库的依赖,如果直接使用makefile会比较的繁琐,而且makefile的推导规则也非常多,对多目录的支持也比较复杂. 最近看了一下cmake,发现配置 ...
随机推荐
- 查看网站使用何种框架或者技术的插件——Wappalyzer
Wappalyzer这款插件很强大,可以查看任何网站使用的技术,包括后端语言框架和前端语言框架.还有服务器是何种类型.甚至各种版本... 插件官网:https://wappalyzer.com/
- SoapUI、Jmeter、Postman三种接口测试工具的比较分析——灰蓝
前段时间忙于接口测试,也看了几款接口测试工具,简单从几个角度做了个比较,拿出来与诸位分享一下吧.各位如果要转载,请一定注明来源,最好在评论中告知博主一声,感谢.本报告从多个方面对接口测试的三款常用工具 ...
- Cronolog 分割 Tomcat8 Catalina.out日志 (转)
默认情况下,tomcat的catalina.out日志文件是没有像其它日志一样,按日期进行分割,而是全部输出全部写入到一个catalina.out,这样日积月累就会造成.out日志越来越大,给管理造成 ...
- android问题及其解决-优化listView卡顿和怎样禁用ListView的fling
问题解决-优化listView卡顿和怎样禁用ListView的fling 前戏非常长,转载请保留出处:http://blog.csdn.net/u012123160/article/details/4 ...
- [RxJS] Avoid mulit post requests by using shareReplay()
With the shareReplay operator in place, we would no longer fall into the situation where we have acc ...
- 魅族MX5和努比亚布拉格手机參数对照
想买个Android手机锁定魅族MX5和努比亚布拉格.两个官网翻来翻去的非常难取舍,自己列了一个表对比了一下參数,本人喜欢薄一点的手机.有feel.參数对比表例如以下: 手机 魅族MX5 努比亚布拉格 ...
- centos php 安装memcached 扩展 支持sasl
1.安装sasl yum install cyrus-sasl-lib.x86_64 yum install cyrus-sasl-devel.x86_64 2.下载libmemcached wget ...
- amazeui学习笔记--js插件(UI增强4)--下拉组件Dropdown
amazeui学习笔记--js插件(UI增强4)--下拉组件Dropdown 一.总结 1.am-dropdown(及其孩子):控制下拉列表的样式 2.data-am-dropdown(及其孩子):控 ...
- 基于element ui的图片预览插件
写插件很简单,满足两个条件即可,一.基本的逻辑思路,二.熟悉插件语法要求.本次Vue插件也比较简单,点击“查看图片”用轮播的方式限制用户上传的图片,如图: 项目采用的是vue-element-admi ...
- SQLite header and source version mismatch解决方案
SQLite header and source version mismatch 最近需要用到sqlite,去官网下了一个编译安装后打开sqlite3出现SQLite header and sour ...