c语言序列化和反序列化
c语言序列化和反序列化
网络调用,数据存取,数据传输都需要把数据序列化和反序列化。杀鸡不喜欢用牛刀,自己从底层设计协议又太繁琐,难以维护和扩展。使用 tpl (http://troydhanson.github.io/tpl/)这个库,可以很方便地构造自己的协议。
我采用 TLV 协议形式,即 (key,type,length,value) 4元组。key 是唯一的名称,type 是key保存的值的类型(用一个字符表示),length 是 value 的长度(应该叫 size 更贴近),value 是可以保存任何数据。发送数据的一方发送【“name”=“cheungmine”, “country”=“china”】, 接收数据的一方接收到之后,成为一个数组(UTArray),可以转为map(kvpairs_to_map),这样就容易获取特定些字段的内容了。
本文不特定于用户的具体协议内容,也不考虑数据存放的字节次序。这些都由用户自己完成。
因此可以定义个 tlv 数据节如下:
typedef struct kvpair_t
{
char *key; /* we'll use this field as the key */
char type;
union {
struct {
void *val;
uint32_t siz;
};
tpl_bin bval;
};
UT_hash_handle hh; /* makes this structure hashable */
} kvpair_t;
一个数据祯由1~N个这样的TLV 构成。我实现了基本的序列化(pack)和反序列化(unpack)基础功能。任何协议只要在这基础封装自己特有的字段(key)即可。下面是 tplut.h和tplut.c以及测试代码。
下面的代码可以在任何平台编译使用。
tplut.h
/***********************************************************************
* Copyright (c) 2008-2080 pepstack.com, 350137278@qq.com
*
* ALL RIGHTS RESERVED.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
********************************