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

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>"
        }
}

相关推荐

    xpack代码,用于结构体和xml/json之间的转换

    `xpack` 是一个针对这一需求而设计的代码库,它的主要功能是实现结构体(struct)与XML和JSON两种数据格式之间的高效转换。在本文中,我们将深入探讨这些知识点,以及它们在实际开发中的应用。 首先,我们来看`...

    C语言教学课件:c语言结构体.ppt

    C语言教学课件:c语言结构体.ppt

    C++结构体和json/xml之间互相转换

    本篇将探讨如何在C++中实现结构体与JSON和XML之间的互转,并以`bson`库在`xbson`中的支持为例进行说明。 首先,让我们了解JSON和XML的基本概念。JSON是一种轻量级的数据交换格式,其数据结构主要由对象(键值对)和...

    C语言实现的 json格式字符串与结构体自动相互转化

    标题 "C语言实现的 json格式字符串与结构体自动相互转化" 涉及到的核心知识点是C语言编程、JSON解析和结构体操作。C语言是一种底层编程语言,通常用于系统编程、嵌入式开发等领域,而JSON(JavaScript Object ...

    C语言程序设计:c语言结构体.ppt

    在C语言中,结构体(struct)是一种复合数据类型,它允许我们将不同类型的数据组合到一个单一的实体中,便于管理和操作。这种数据结构在编程中非常有用,尤其是在处理复杂的数据模型时,如表示学生信息、公司员工...

    C语言全套资料 C语言程序设计 C语言算法 C语言课件 C语言顺序程序设计,C语言数组,C语言循环控制,C语言预处理命令,C语言文件操作指针,C语言选择结构程序设计,C语言结构体与共用体,C语言文件操作,C语言函数

    8. **C语言文件操作**:C语言提供了标准I/O库来读写文件,学习者将学会如何打开、关闭文件,以及如何读取和写入数据。 9. **C语言指针**:指针是C语言的精髓,它们允许直接操作内存地址,提供高效的数据操作和复杂...

    结构体和XML互转

    1、结构体转XML:定义...2、XML转结构体:这个不能直接转化,根据结构体定义,可生成XML转结构体的cs文件,可将生成文件中的类拷贝到你的工程中,调用相应函数,直接将第1步生成的XML字符串逆向转换为定义的结构体。

    C语言结构体实现方法

    在C语言中,结构体(struct)是一种复合数据类型,它允许我们将多个不同类型的变量组合成一个单一的实体。这使得我们能够以更模块化和组织化的方式处理数据。本篇将详细介绍C语言中结构体的实现方法以及规范的编码...

    黑客基地:C语言编程特训班特训3

    4. **结构体与联合体**:C语言支持自定义数据结构,结构体可以将不同类型的数据组合在一起,而联合体则能在同一块内存区域存储不同类型的变量。学习如何定义、初始化和操作结构体与联合体对于处理复杂数据结构至关...

    深入解析JNA—模拟C语言结构体

    ### 深入解析JNA—模拟C语言结构体 #### 前言 在《JNA—JNI终结者》一文中介绍了Java Native Access (JNA) 的基本使用方法及其优势,但当时并未深入探讨如何在Java中模拟C语言中的结构体(structure)。结构体在C语言...

    C语言:指向结构体的指针.c

    C语言:指向结构体的指针.c

    C语言结构体之位域详解

    文章主要对C语言结构体的位域知识进行详细介绍。

    C语言 结构体范例代码

    在C语言中,结构体(struct)是一种复合数据类型,它允许我们将多个不同类型的变量组合成一个单一的实体。这使得我们能够创建更复杂的数据结构,以更好地模拟现实世界中的对象或概念。以下是对“C语言 结构体范例...

    C语言结构体程序设计

    在C语言中,结构体(Struct)是一种非常重要的数据类型,它允许我们将多个不同类型的数据组合成一个新的复合类型,便于管理和操作。结构体常用于描述复杂的数据结构,如学生信息、图书信息等。在本课程中,我们将...

    c语言 结构体与共用体

    在C语言中,结构体(Struct)和共用体(Union)是两种非常重要的复合数据类型,它们允许我们将多个不同类型的数据成员组合成一个单一的实体,以方便管理和使用。接下来,我们将深入探讨这两种数据类型的定义、特点...

    C语言结构体知识汇总

    C语言结构体部分内容详解包括结构体定义及使用,结构体函数的定义及使用,指向结构体的指针

    C语言结构体与共用体

    C语言结构体与共用体 C语言中结构体是一种构造数据类型,用途是把不同类型的数据组合成一个整体。结构体类型定义描述结构的组织形式,不分配内存。结构体类型定义的作用域是全局的或局部的,视定义的位置而定。 ...

    基于protobuf反射特性的pb、json相互转换的实例程序(C++)

    前者的作用是将pb结构转换成对应的json,后者是将json转换成对应的pb结构体。代码中也对关键处理步骤进行了注释说明,相信有了这个实例后json、pb相互转换对你来说将变得一目了然。 使用过程如果有问题可以私信博主...

    C语言结构体共2页.pdf.zip

    "C语言结构体共2页.pdf.zip"可能包含关于结构体的基本概念、定义、初始化、指针操作以及结构体数组和结构体指针的使用等内容。下面将详细介绍这些知识点。 1. **结构体定义**: 在C语言中,我们可以通过`struct`...

Global site tag (gtag.js) - Google Analytics