一个类似 protobuf, thrift 的 data serialization, rpc 的库。不过 avro 比较有意思的地方就是不用给 client/server 生成相应的 proxy code,而是通过一个 json 的 schema 去描述。比较方便动态语言。
看起来也比较适合游戏客户端/服务器间的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
------------------------------------------------
评论