最近完善自己的項目中,將很多原先的framework下的類庫都轉為.net standard類庫,服務自然也往.netCore上轉.因此,寫了一個WebApi做為服務來完善自己的類庫程式. 在我的程式體系中中有一部分的方式是要客戶端傳送Sql到服務端,服務端返回DataSet到客戶端進行處理,WCF ...
最近完善自己的項目中,將很多原先的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序列化加上專門的字元串替換方式.