浏览 5814 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-01-20
最后修改:2009-11-06
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 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2009-08-02
最后修改: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>" } } |
|
返回顶楼 | |
发表时间:2009-08-02
最后修改:2009-11-06
发布 0.3 版本,新增特性
1.增加了对 ProtoBuf wire format 的支持 [url]http://spdatapickle.googlecode.com/files/spdatapickle-0.3.src.tar.gz [/url] |
|
返回顶楼 | |
发表时间:2009-11-06
发布 0.5 版本,包括
1.protobuf 的一些 bugfix 2.移植到 win32 平台 http://spdatapickle.googlecode.com/files/spdatapickle-0.5.src.tar.gz |
|
返回顶楼 | |