欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

关于.NetCore与.Netframework 对于DataSet的序列化与反序列化问题的探讨.

程序员文章站 2022-12-08 21:34:02
最近完善自己的项目中,将很多原先的framework下的类库都转为.net standard类库,服务自然也往.netCore上转.因此,写了一个WebApi做为服务来完善自己的类库程序. 在我的程序体系中中有一部分的方式是要客户端传送Sql到服务端,服务端返回DataSet到客户端进行处理,WCF ......

最近完善自己的项目中,将很多原先的framework下的类库都转为.net standard类库,服务自然也往.netcore上转.因此,写了一个webapi做为服务来完善自己的类库程序.

在我的程序体系中中有一部分的方式是要客户端传送sql到服务端,服务端返回dataset到客户端进行处理,wcf的服务端运行了7,8年了都很稳定,打算将webapi的服务也完善进去.

这里自然最重要的一步就是dataset的序列化和反序列化.

关于dataset的序列化与反序列化,自然是用到了我十来年一直用的xmlserializer类来进行,没有任何问题,没想到这里在反序列化时竟然报错,我都不敢相信自己的眼睛.

关于.NetCore与.Netframework 对于DataSet的序列化与反序列化问题的探讨.

经过各种猜测,各种尝试后,发现如果客户端也用.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序列化加上专门的字符串替换方式.