- 论坛徽章:
- 0
|
原帖由 yulihua49 于 2009-10-10 16:05 发表
在网络上,各种不同系统,二进制不方便。
实际上是用模板映射结构,要很仔细保持模板和结构的关系。
使用xml格式做模板效率较低,在C语言里我更喜欢用结构做模板,其他语言可以用xml。
我也搞了一个JSON ...
这个自动序列化的关键,就在于要在 c/c++ 实现类似 java 的反射机制。
java 的反射机制,是由于在语言级别为每个类生成了 metainfo ,我们可以直接使用。
c/c++ 中,对于 structure 默认没有生成 metainfo ,因此需要我们自己来生成。
spdatapickle 中,xml 文件在运行时是不需要的,只是在编译期需要。
通过 xml 文件的描述,自动生成 structure ,同时生成 structure 的 metainfo ,
可以确保 structure 和 metainfo 是对应的。这些 metainfo 就在 dp_xyzaddrbook.cpp 文件中。
这些 metainfo ,主要信息包含 structure 中各个字段的类型,名称,偏移位置,编号。
有了这些信息,就可以遍历一个 structure 的所有字段,这就相当于具有了 java 中的反射机制。
有了这套反射机制,很多 java 中能做的事情,在 c/c++ 中都是可以做的。比如 java 的自动序列化,或者 ORM 。
关于 DTO ,从下面的连接来看
http://space.itpub.net/8804348/viewspace-478471
里面提到的映射模板,是要人工手写么?这个映射模板,就相当于上面提到的 metainfo 。
在 spdatapickle 里面,这个 metainfo 是通过从 xml 描述中自动生成的,同时由于 structure 也是从 xml 描述生成的,
因此可以保证 structure 和 metainfo 是完全一致的。
- SRM的映射模板,相当于iBates的映像文件:
- T_PkgType seat_type[] = { /* 席位表 */
- {CH_DATE,YEAR_TO_DAY_LEN,"start_date",YEAR_TO_DAY,-1}, /* 始发日期 YYYY-MM-DD*/
- {CH_CHAR,5,"beg_station"}, /* 上车站 */
- {CH_CHAR,13,"Train_no"}, /* 始发车次 */
- {CH_CHAR,7,"run_train"}, /* 运行车次 */
- ......
- {-1,0,0}
- };
复制代码
对应 spdatapickle 里面,生成的 metainfo 类似是这样
- 自动生成的结构体
- typedef struct tagXYZPhoneNumber {
- char mType[10];
- int mPrimary;
- char * mContent;
- } XYZPhoneNumber_t;
- 自动生成的 metainfo
- static SP_DPMetaField_t gMetaXYZPhoneNumber [] = {
- { sizeof(SP_DPMetaField_t), 1, "Type",
- // 第一个字段是这个 metafield 本身的大小,为以后扩展留下余地。 第二个字段是 编号,在 protobuf 中用到。第三个是字段名。
- SP_DP_FIELD_OFFSET(XYZPhoneNumber_t, mType), eTypeSPDPChar, 1, 1, 10,
- // 第四个字段是这个字段在结构体中的偏移位置。第五个字段是字段类型。第六个字段表明是否指针。
- // 第七个字段表示是否为必要字段。第8个字段表明是否定为数组。
- "", sizeof(char[10]), sizeof(char), 0 },
- // 第九个字段用于指针类型中,指明指针指向的内容的长度。第十个字段表明这个字段的总大小。第十一个字段表明这个字段每个元素的大小。
- // 第十二个字段表明,这个字段是否为用于指明另外一个字段长度的。
- { sizeof(SP_DPMetaField_t), 2, "Primary",
- SP_DP_FIELD_OFFSET(XYZPhoneNumber_t, mPrimary), eTypeSPDPInt32, 0, 1, 0,
- "", sizeof(int), sizeof(int), 0 },
- { sizeof(SP_DPMetaField_t), 3, "Content",
- SP_DP_FIELD_OFFSET(XYZPhoneNumber_t, mContent), eTypeSPDPChar, 1, 1, 0,
- "", sizeof(char *), sizeof(char), 0 }
- };
复制代码
[ 本帖最后由 iunknown 于 2009-10-11 12:02 编辑 ] |
|