关于数据交换的思考
今天测试了一下直接通过自带的序列化和ProtoBuff序列化的一个对比。然后再慢慢的说下自己的需求,顺便整理下思路。
测试表有28个字段41W条数据,直接通过XmlSerializer将数据集序列化出来的话差不多有400M左右,通过ProtoBuff的Serializer序列化之后文件大小为69M左右,执行步骤为:取数据集,实体化,序列化,总共执行时间差不多是1分半钟,取数据1分钟,实体化20秒,序列化4秒。前者执行步骤应该是:取数据集,直接序列化,总执行时间差不多也是1分半钟,取数据集1分钟左右,序列化30秒。不知道是不是实体化之后会比直接用DataSet序列化要快,接着执行测试三,取数据集,实体化,再序列化,取数据1分钟,实体化20秒,序列化14秒。比直接序列化DataSet还稍微慢了那么一点点。在序列化这个操作上面来看ProtoBuff是有绝对的领先优势啊。
可惜的是ProtoBuff不能直接序列化DataSet,.net数据类型中只能是lists或者arrays,要不就是自定义的data-contract 类。
测试结果就说到这了,截下来说下自己的需求。
主要是要找到一个比较好的数据交换的方式,采取什么作为中间文件,采取什么作为配置文件等。主要是数据库级别的数据交换。
交换的配置文件肯定是采用xml最为方便了,描述清楚源到目标的表和字段信息就应该ok了。通过xml去配置源到目标的对应关系,但是取出来数据集之后也没有办法去生成实体类,因为这个实体类得根据你的配置文件来,数据集中只包含你配置文件中配了的那些字段,能否通过xml中配置的源或者是目标数据库中涉及到交换的字段动态的生成一个自定义的类?难道得做一个生成交换配置文件的时候顺便生成一个源和目标的data-contract 类?
但是这样也存在一个问题,就是即使你生成了data-contract 类,你还得编译进去才能使用。这一点会令人比较郁闷,类的结构未知,动态编译之后要能拿来直接new。先给个data-contract 类的例子。
[ProtoContract]public class Catalog{[ProtoMember(1)]public string ItemID{get;set;}[ProtoMember(2)]public string Path{get;set;}[ProtoMember(3)]public string Name{get;set;}[ProtoMember(4)]public string ParentID{get;set;}[ProtoMember(5)]public string Type{get;set;}[ProtoMember(6)]public string Content{get;set;}[ProtoMember(7)]public string Intermediate{get;set;}[ProtoMember(8)]public string SnapshotDataID{get;set;}[ProtoMember(9)]public string LinkSourceID{get;set;}[ProtoMember(10)]public string Property{get;set;}[ProtoMember(11)]public string Description{get;set;}[ProtoMember(12)]public string Hidden{get;set;}[ProtoMember(13)]public string CreatedByID{get;set;}[ProtoMember(14)]public DateTime CreationDate{get;set;}
[ProtoMember(15)]public string ModifiedByID{get;set;}[ProtoMember(16)]public DateTime ModifiedDate{get;set;}
[ProtoMember(17)]public string MimeType{get;set;}[ProtoMember(18)]public string SnapshotLimit{get;set;}[ProtoMember(19)]public string Parameter{get;set;}[ProtoMember(20)]public string PolicyID{get;set;}[ProtoMember(21)]public string PolicyRoot{get;set;}[ProtoMember(22)]public string ExecutionFlag{get;set;}[ProtoMember(23)]public DateTime ExecutionTime{get;set;}
}
Dead End。貌似这个方式不可取。