`
iunknown
  • 浏览: 410873 次
社区版块
存档分类
最新评论

SPDataPickle: c语言的结构体和 xml/json/protobuf 的自动转化

阅读更多
SPDataPickle 是一种轻便高效的结构化数据和xml/json/protobuf自动序列化库,很适合 RPC 数据交换的场合。

http://code.google.com/p/spdatapickle
http://spdatapickle.googlecode.com/files/spdatapickle-0.5.src.tar.gz

大家可能对 google 的 protocol buffers 都早有耳闻。SPDataPickle 和 protobuf 很相似。

仿照 google protobuf 的例子,也来一个 Person 的简单例子。

对应 a.proto ,要写一个 a.xml
<metainfo prefix="XYZ" filename="account">
    <struct name="Person">
        <field name="id"    type="int32" />
        <field name="name"  type="*char" />
        <field name="email" type="*char" />
    </struct>
</metainfo>


然后使用 spxml2struct 处理这个 a.xml,生成具体的 structure 定义和 metainfo 。
enum {
    eTypeXYZPerson = eTypeSPDPUserDefine + 1 
};

typedef struct tagXYZPerson {
    int mId;
    char * mName;
    char * mEmail;
} XYZPerson_t;

typedef struct tagSP_DPMetaInfo SP_DPMetaInfo_t;
extern SP_DPMetaInfo_t * gXYZAccountMetaInfo;


然后就可以对这个 XYZPerson_t 结构进行序列化和反序列化。
int main( int argc, char * argv[] )
{
    XYZPerson_t person;

    person.mId = 123;
    person.mName = strdup( "Bob" );
    person.mEmail = strdup( "bob@example.com" );

    SP_XmlStringBuffer buffer;

    SP_XmlPickle pickle( gXYZAccountMetaInfo );
    pickle.pickle( &person, sizeof( person ), eTypeXYZPerson, &buffer );

    printf( "xml: %s\n", buffer.getBuffer() );

    XYZPerson_t other;
    pickle.unpickle( buffer.getBuffer(), buffer.getSize(),
            eTypeXYZPerson, &other, sizeof( other ) );

    printf( "id %d, name %s, email %s\n", other.mId, other.mName, other.mEmail );

    SP_DPAlloc alloc( gXYZAccountMetaInfo );

    alloc.free( &person, sizeof( person ), eTypeXYZPerson );
    alloc.free( &other, sizeof( person ), eTypeXYZPerson );

    return 0;
}


输出结果
xml: <Person>
<id>123</id>
<name>Bob</name>
<email>bob@example.com</email>
</Person>

id 123, name Bob, email bob@example.com
分享到:
评论
3 楼 iunknown 2009-11-06  
发布 0.5 版本,包括
1.protobuf 的一些 bugfix
2.移植到 win32 平台

http://spdatapickle.googlecode.com/files/spdatapickle-0.5.src.tar.gz
2 楼 iunknown 2009-08-02  
发布 0.3 版本,新增特性
1.增加了对 ProtoBuf wire format 的支持

[url]http://spdatapickle.googlecode.com/files/spdatapickle-0.3.src.tar.gz [/url]
1 楼 iunknown 2009-08-02  
发布 0.2 版本,新增特性
1.增加了对 json 的支持
2.xml pickle 和 json pickle 用一个统一的接口,方便使用
3.在 metainfo 中支持指定某个字段是可选的,在解包的时候,如果对应的字段不存在,直接跳过

http://spdatapickle.googlecode.com/files/spdatapickle-0.2.src.tar.gz

<metainfo prefix="XYZ" filename="addrbook">
    <struct name="Email">
        <field name="Type"    type="char" arraysize="10" />
        <field name="Address" type="*char" />
        <field name="Nickname" type="*char" required="0" />
    </struct>
</metainfo>


void testEmail( SP_DataPickle * pickle )
{
    XYZEmail_t email;
    memset( &email, 0, sizeof( email ) );

    strncpy( email.mType, "work", sizeof( email.mType ) - 1 );
    email.mAddress = strdup( "foo <foo@bar.com>" );

    SP_XmlStringBuffer buffer;

    pickle->pickle( &email, sizeof( email ), eTypeXYZEmail, &buffer );

    printf( "%s\n\n", buffer.getBuffer() );

    SP_DPAlloc alloc( gXYZAddrbookMetaInfo );
    alloc.free( &email, sizeof( email ), eTypeXYZEmail );
}


序列化的结果
{
        "Email" : {
                "Type" : "work",
                "Address" : "foo <foo@bar.com>"
        }
}

相关推荐

    类似 google protobuf,用于序列化/反序列化 c 结构体

    使用这样的库,开发者可以定义C语言结构体,并利用库提供的接口将其序列化为XML、JSON或二进制格式,反之亦然。 在使用这个库时,开发者首先需要定义结构体,然后使用库提供的API来注册这些结构体并指定序列化/反...

    protobuf-c-1.2.1.tar.gz

    在安装完成后,你可以利用protobuf-c提供的工具`protoc-c`来编译.proto文件,生成C语言的结构体和序列化/反序列化的函数。这样,你就可以在C语言项目中方便地使用protobuf定义的数据结构了。 在开发过程中,参照...

    cpp-protobufcProtocolBuffers的C语言实现

    与XML或JSON相比,它占用更少的空间,处理速度更快。通过定义.proto文件,用户可以声明消息类型,这些消息类型随后会被编译成C源码和头文件,供程序使用。 ### 2. `protobuf-c`的安装与使用 安装`protobuf-c`通常...

    nanopb 基于嵌入式protobuf的移植例程

    protobuf的语法类似于XML或JSON,但更加紧凑和高效。 2. **nanopb简介**:`nanopb`由Jesse Tuomela开发,主要针对嵌入式系统,提供了一个轻量级的protobuf实现。它不依赖动态内存分配,且支持代码生成,使得开发者...

    stm32移植protobuf(nanopb-0.3.8-windows-x86)操作说明

    - Protobuf是一种二进制数据表示方式,比XML和JSON更紧凑,解析速度更快。 - Nanopb是protobuf的轻量级实现,没有动态内存分配,适合嵌入式系统。它的特点是代码生成简单,支持固定大小的消息,可以手动控制内存。...

    a small protobuf implementation in C.zip

    这些文件包含字段的类型、顺序和标签,类似于XML或JSON schema。 2. **编译器工具**:一个protobuf编译器(protoc)会读取.proto文件,并生成对应的C代码,包括结构体定义、编码和解码函数。 3. **编码与解码**:C...

    protobuf 测试

    protobuf,全称Protocol Buffers,是Google开发的一种数据序列化协议,用于结构化数据的串行化,类似于XML、JSON等格式,但更小、更快、更简单。它能够将结构化的数据序列化,可用于数据存储、通信协议等方面。...

    A protocol buffers library for C.zip

    Protocol Buffers,通常简称为ProtoBuf,是Google开发的一种数据序列化协议,它允许结构化数据串行化,类似于XML、JSON,但更小、更快、更简单。 ProtoBuf库适用于多种编程语言,包括C++、Java、Python等,而"A ...

    pata_cs5535.rar_If...

    可以使用诸如protobuf、JSON或XML这样的数据交换格式,或者自定义二进制格式来实现序列化。对于“pata_cs5535.c”文件,我们可以假设它包含了一个实现序列化的示例代码,或者是一个用于检查是否需要序列化的测试用例...

    用原始时代的C结构设计消息协议(C++asio网络库相关)

    在大多数现代网络应用中,更推荐使用如protobuf、Cap'n Proto等序列化库,或者直接使用JSON、XML等文本格式来定义更灵活、易扩展且跨语言兼容的消息协议。这些现代方法可以更好地处理复杂数据,解决大小端问题,并...

Global site tag (gtag.js) - Google Analytics