使用 JSON.net 反序列化数据表中的字节数组列

本文关键字:字节 字节数 数组 JSON net 反序列化 数据表 使用 | 更新日期: 2023-09-27 18:35:16

我有一个接受SQL服务器查询的项目,将此查询传递给执行此查询的Web服务,将结果传递回客户端,然后返回DataSet结果(以及一些其他属性)。 目前,它使用 WCF 和 SOAP 进行通信。 为了减少总请求时间,我正在尝试将其移动到Web API和JSON。 根据我的概念验证,这减少了大约 30% 的总请求时间,考虑到该服务的吞吐量,这很重要。

我的问题是某些查询(我无法控制)从SQL Server中的图像列返回数据。 JSON.net 数据表转换器非常高兴地将其作为字节数组进行编码,并对其进行 base64 编码。 问题发生在客户端,同一个转换器只是拾取此值并将其视为字符串,当我的项目的使用者期望它是一个字节数组时,会导致问题。

我想我可以使用序列化程序上的 TypeNameHandling.All 选项,但数据表转换器不希望将 JsonToken.StartObject 类型的令牌作为DataTable主体的一部分。

鉴于我无法控制

运行的查询、预期返回的数据类型以及无法控制它们的使用方式,我是否可以采取任何措施来成功传递字节数组作为具有 JSON.net 的数据表的一部分?

使用 JSON.net 反序列化数据表中的字节数组列

默认转换器的根本问题是它试图暗示纯粹基于数据的数据类型。 我在问这个问题时没有意识到,但我还需要确保在反序列化时可以获得与服务器上完全相同的数据表。

所以我的解决方案是创建我自己的转换器实现 DataSetDataTable . 它输出的 JSON 并不像默认创建的 JSON 那么漂亮,但如果您要传输超过 1 行数据,它应该会产生更紧凑的 JSON。 代码太大,无法有意义地发布在 SO 上,所以我将整个项目放在 GitHub 上。

解决此问题

的最简单方法是将此base64编码字符串转换为客户端中的byte []

string myPicture= dataRow["MY_PICTURE"].ToString();
myPicture= myPicture.Replace(" ", "+"); //Optional
byte[] myPictureInByte = Convert.FromBase64String(myPicture);

第二行是可选的。在客户端中反序列化时base64我得到了没有"+"的编码字符串。所以我将它们添加回字符串并转换为byte [].