关于.NetCore与.Netframework 对于DataSet的序列化与反序列化问题的探讨.
最近完善自己的项目中,将很多原先的framework下的类库都转为.net standard类库,服务自然也往.netcore上转.因此,写了一个webapi做为服务来完善自己的类库程序.
在我的程序体系中中有一部分的方式是要客户端传送sql到服务端,服务端返回dataset到客户端进行处理,wcf的服务端运行了7,8年了都很稳定,打算将webapi的服务也完善进去.
这里自然最重要的一步就是dataset的序列化和反序列化.
关于dataset的序列化与反序列化,自然是用到了我十来年一直用的xmlserializer类来进行,没有任何问题,没想到这里在反序列化时竟然报错,我都不敢相信自己的眼睛.
经过各种猜测,各种尝试后,发现如果客户端也用.netcore,就不会报错.加之现在这个序列化的方式过于老旧,打算用比较新的newtonsoft.json来进行dataset的序列化与反序列化,而且还用到专门序列化与反序列化dataset的方法
stringdataset = jsonconvert.serializeobject(ds, new newtonsoft.json.converters.datasetconverter()); dataset ds1 = jsonconvert.deserializeobject<dataset>(stringdataset, new newtonsoft.json.converters.datasetconverter());
我还专门看了看序列化之后的字符串:
{"table":[{"ip":"*.*.*.*","uuid":null,"key":"xys.lab.bll.logindemo.getuser","value":"select * from users where loginname_str='{0}'","创建时间":"2020-04-07t14:44:28","修改时间":null,"id":"68d26fac-ea54-4617-b5ea-c0777603df5c"}]}
我看到这个序列化后的字符串后,心就凉了,这tm的序列化完事了连个列的类型都不标注,百分百反序列化后会有问题,类型肯定是转换不对的.果不其然,虽然可以反序列化成dataset,也有值,看着也对,但是往细里面看数据类型的时候,发现原本dataset中的guid类型,转换完成后变成了string类型.这让我很郁闷.
但是同时也给了我一个提示,是不是再用xmlserializer序列化反序列化的时候,也是类型出了问题呢?
经过认真对比.netcore下序列化的结果和.net framework序列化后的结果发现了:
<xs:element name="uuid" msdata:datatype="system.guid, system.private.corelib, version=4.0.0.0, culture=neutral, publickeytoken=7cec85d7bea7798e" type="xs:string" minoccurs="0" /> <xs:element name="uuid" msdata:datatype="system.guid, mscorlib, version=4.0.0.0, culture=neutral, publickeytoken=b77a5c561934e089" type="xs:string" minoccurs="0" />
问题就出在这里,在.netcore里和.net framework里 对于这种特殊类型的序列化,做了详细的说明,连后面的dll,版本号等详细信息都列出来了,所以自然转换不过来.
当我把.netcore序列化的结果里关于guid类型的这个描述替换成了.netframework下的之后,反序列化成功了,而且很完美.但是这里还有一个问题,到底有多少种类型在序列化的时候跟guid一样呢?我查了半天也没查到.
所以这里陷入了两难的境地.
用newtonsoft.json序列化实在是太粗了,反序列化后竟然有数据类型不一致的问题.
但是用xmlserializer序列化又太tm的细致了,我可以替换一个guid,但是不能保证所有的类似于guid的类型都替换.
在此记录也算是给各位一个提醒,少走弯路,目前我大致的想法是先用newtonsoft.json做序列化,真的后面出现类型不一致造成问题了,再处理吧.
newtonsoft.json做序列化因为类型果然出现了问题,之前的代码在给dataset复制的时候,报错了,类型不对,看来目前还要用xmlserializer序列化加上专门的字符串替换方式.