惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Engineering at Meta
Engineering at Meta
Microsoft Azure Blog
Microsoft Azure Blog
I
InfoQ
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
人人都是产品经理
人人都是产品经理
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
T
Tailwind CSS Blog
MongoDB | Blog
MongoDB | Blog
Google DeepMind News
Google DeepMind News
WordPress大学
WordPress大学
量子位
美团技术团队
大猫的无限游戏
大猫的无限游戏
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Last Week in AI
Last Week in AI
博客园 - 司徒正美
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
小众软件
小众软件
C
Check Point Blog
博客园 - 三生石上(FineUI控件)
N
Netflix TechBlog - Medium
Recent Announcements
Recent Announcements
有赞技术团队
有赞技术团队
月光博客
月光博客

博客园 - 队长

利用selenium将edge浏览器里面的网页保存为pdf Netcore logging config Some good articles Microservices with Spring Boot ngrok的简单使用 - 队长 通过Ajax上传文件至WebApi服务器 Simple Pipelined Function Simple layout WebApi中利用Razor模板引擎来生成html Spring Boot - Filter实现简单的Http Basic认证 EF DI & MVC EF UoC ks 图片 UEditor Alvin temp Assembly binding Tech Links
DataSet 序列化时保持行状态
队长 · 2020-07-23 · via 博客园 - 队长

有时候我们的解决方案会混用.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压缩,更省事。