zoukankan      html  css  js  c++  java
  • 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压缩,更省事。

  • 相关阅读:
    poj2386 Lake Counting
    poj 1852 Ants
    Luogu P2419 [USACO08JAN]牛大赛Cow Contest
    Luogu P2336 [SCOI2012]喵星球上的点名
    Luogu P2463 [SDOI2008]Sandy的卡片
    Luogu P2852 [USACO06DEC]牛奶模式Milk Patterns
    Luogu P4248 [AHOI2013]差异
    【NOI2008】志愿者招募
    Luogu P2743 [USACO5.1]乐曲主题Musical Themes
    P3723 [AH2017/HNOI2017]礼物
  • 原文地址:https://www.cnblogs.com/teamleader/p/13368191.html
Copyright © 2011-2022 走看看