最近完善自己的項(xiàng)目中,將很多原先的framework下的類庫都轉(zhuǎn)為.net standard類庫,服務(wù)自然也往.netCore上轉(zhuǎn).因此,寫了一個WebApi做為服務(wù)來完善自己的類庫程序. 在我的程序體系中中有一部分的方式是要客戶端傳送Sql到服務(wù)端,服務(wù)端返回DataSet到客戶端進(jìn)行處理,WCF的服務(wù)端運(yùn)行了7,8年了都很穩(wěn)定,打算將WebApi的服務(wù)也完善進(jìn)去. 這里自然最重要的一步就是DataSet的序列化和反序列化. 關(guān)于DataSet的序列化與反序列化,自然是用到了我十來年一直用的XmlSerializer類來進(jìn)行,沒有任何問題,沒想到這里在反序列化時竟然報錯,我都不敢相信自己的眼睛. 經(jīng)過各種猜測,各種嘗試后,發(fā)現(xiàn)如果客戶端也用.NetCore,就不會報錯.加之現(xiàn)在這個序列化的方式過于老舊,打算用比較新的Newtonsoft.Json來進(jìn)行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}'","創(chuàng)建時間":"2020-04-07T14:44:28","修改時間":null,"ID":"68d26fac-ea54-4617-b5ea-c0777603df5c"}]} 我看到這個序列化后的字符串后,心就涼了,這tm的序列化完事了連個列的類型都不標(biāo)注,百分百反序列化后會有問題,類型肯定是轉(zhuǎn)換不對的.果不其然,雖然可以反序列化成DataSet,也有值,看著也對,但是往細(xì)里面看數(shù)據(jù)類型的時候,發(fā)現(xiàn)原本DataSet中的Guid類型,轉(zhuǎn)換完成后變成了string類型.這讓我很郁悶. 但是同時也給了我一個提示,是不是再用XmlSerializer序列化反序列化的時候,也是類型出了問題呢? 經(jīng)過認(rèn)真對比.NetCore下序列化的結(jié)果和.Net framework序列化后的結(jié)果發(fā)現(xiàn)了: <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里 對于這種特殊類型的序列化,做了詳細(xì)的說明,連后面的DLL,版本號等詳細(xì)信息都列出來了,所以自然轉(zhuǎn)換不過來. 當(dāng)我把.NetCore序列化的結(jié)果里關(guān)于Guid類型的這個描述替換成了.Netframework下的之后,反序列化成功了,而且很完美.但是這里還有一個問題,到底有多少種類型在序列化的時候跟Guid一樣呢?我查了半天也沒查到. 所以這里陷入了兩難的境地. 用Newtonsoft.Json序列化實(shí)在是太粗了,反序列化后竟然有數(shù)據(jù)類型不一致的問題. 但是用XmlSerializer序列化又太tm的細(xì)致了,我可以替換一個Guid,但是不能保證所有的類似于Guid的類型都替換. 在此記錄也算是給各位一個提醒,少走彎路,目前我大致的想法是先用Newtonsoft.Json做序列化,真的后面出現(xiàn)類型不一致造成問題了,再處理吧. Newtonsoft.Json做序列化因?yàn)轭愋凸怀霈F(xiàn)了問題,之前的代碼在給dataset復(fù)制的時候,報錯了,類型不對,看來目前還要用XmlSerializer序列化加上專門的字符串替換方式. |
|