注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Code@Pig Home

喜欢背着一袋Code傻笑的Pig .. 忧美.欢笑.记忆.忘却 .之. 角落

 
 
 

日志

 
 

[avro-c] hello, apache avro  

2010-12-29 08:47:17|  分类: serialize_avro |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
一个类似 protobuf, thrift 的 data serialization, rpc 的库。不过 avro 比较有意思的地方就是不用给 client/server 生成相应的 proxy code,而是通过一个 json 的 schema 去描述。比较方便动态语言。
http://avro.apache.org/

看起来也比较适合游戏客户端/服务器间的rpc。
------------------------------------------------
#include <avro.h>
#include <stdio.h>
#include <stdlib.h>

#define PERSON_SCHEMA \
"{\"type\":\"record\",\
  \"name\":\"Person\",\
  \"fields\":[\
     {\"name\":\"ID\",    \"type\":\"long\"},\
     {\"name\":\"Phone\", \"type\":\"string\"}]\
}"

avro_schema_t init_schema()
{
    avro_schema_t person_schema;
    avro_schema_error_t error;

    if (avro_schema_from_json(PERSON_SCHEMA, sizeof(PERSON_SCHEMA),
                &person_schema, &error)) {
        fprintf(stderr, "schema error\n");
        exit(EXIT_FAILURE);
    }

    return person_schema;
}

void add_person(avro_writer_t writer, int64_t id, const char *phone)
{
    avro_datum_t person = avro_record("Person", NULL);
    avro_datum_t id_datum    = avro_int64(id);
    avro_datum_t phone_datum = avro_string(phone);

    avro_record_set(person, "ID", id_datum);
    avro_record_set(person, "Phone", phone_datum);

    avro_write_data(writer, NULL, person);

    avro_datum_decref(id_datum);
    avro_datum_decref(phone_datum);
    avro_datum_decref(person);
}

void print_person(avro_reader_t reader, avro_schema_t schema)
{
    avro_datum_t person;
    if ( avro_read_data(reader, schema, schema, &person) == 0 )
    {
        int64_t id;
        char *phone;
        avro_datum_t id_datum, phone_datum;

        avro_record_get(person, "ID", &id_datum);
        avro_int64_get(id_datum, &id);

        avro_record_get(person, "Phone", &phone_datum);
        avro_string_get(phone_datum, &phone);

        printf("id: %lld, phone: %s\n", id, phone);

        avro_datum_decref(person);
    }
}

int main()
{
    avro_schema_t schema;
    avro_writer_t mem_writer;
    avro_reader_t mem_reader;
    char buf[1024];

    schema = init_schema();
    mem_writer = avro_writer_memory(buf, 1024);
    add_person(mem_writer, 1, "11111");
    add_person(mem_writer, 2, "22222");

    printf("data len = %ld\n", avro_writer_tell(mem_writer));
    mem_reader = avro_reader_memory(buf, avro_writer_tell(mem_writer));
    avro_writer_free(mem_writer);

    print_person(mem_reader, schema);
    print_person(mem_reader, schema);
    avro_reader_free(mem_reader);

    return 0;
}
------------------------------------------------
$ ./a.out                                                                                                        
data len = 14
id: 1, phone: 11111
id: 2, phone: 22222
------------------------------------------------
  评论这张
 
阅读(1457)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017