1. 程式人生 > 實用技巧 >DataSet 序列化時保持行狀態

DataSet 序列化時保持行狀態

有時候我們的解決方案會混用.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

格式,這樣就能相對高保真"跨平臺"傳輸DataSet了。

參考程式碼如下:

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()); } }