DataSet 序列化時保持行狀態
阿新 • • 發佈:2020-07-23
有時候我們的解決方案會混用.net framework和.net core,比如客戶端用winform,而伺服器端用.net core API。
DataSet在客戶端繫結方面還是非常方便的,因為它能記錄行狀態。可是,在Winform裡面用BinaryFormatter來序列化DataSet,在.net core中反序列化是會出錯(我遇到的錯誤是:Type 'System.String' is not deserializable.)。
雖然WinForm也開始支援.net core了,但遷移也需要成本不是嘛。
解決方案是用xml的方式來序列化,分別輸出Schema和Data,輸出資料時採用DiffGram
參考程式碼如下:
public static class DataSetExt { public static void FromBase64String(this DataSet dataSet, string str) { var splited = str.Split('|'); var msSchema = new MemoryStream(Convert.FromBase64String(splited[0])); var msData = new MemoryStream(Convert.FromBase64String(splited[1])); dataSet.ReadXmlSchema(msSchema); dataSet.ReadXml(msData); } public static string ToBase64String(this DataSet dataSet) { MemoryStream msSchema = new MemoryStream(); dataSet.WriteXmlSchema(msSchema); MemoryStream msData = new MemoryStream(); dataSet.WriteXml(msData, XmlWriteMode.DiffGram); return Convert.ToBase64String(msSchema.ToArray()) + "|" + Convert.ToBase64String(msData.ToArray()); } }