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()); } }
可以再加上gzip压缩,这样base64string能小点,也可以在IIS或nginx上配置一下gzip压缩,更省事。