将带有byte []列的DataTable序列化为json会生成base64字符串,但是当反序列化时,它会生成一个带字符串列的DataTable

时间:2017-09-11 14:50:26

标签: c# datatable json.net base64 json-deserialization

我已将f1列的DataTable序列化为byte []。该列被序列化为Base-64字符串,如下所示:

        [
          {
            "f1": "5hAAJEA=",
            "f2": "hi_all",
            "id": 1
          },
          {
            "f1": "5hrwJEA=",
            "f2": "hi world",
            "id": 2
          }
        ]

我使用以下代码用Json.Net序列化数据表:

      var json = JsonConvert.SerializeObject(dataTable, settings);

将json字符串反序列化为DataTable时,会生成一个数据表对象,其中acolumn f1为字符串(不是byte []),其值为base64字符串。

我认为这是预期的,因为数据表是没有架构的通用结构。

我知道使用list<Dto>使用类型为byte[]的属性进行反序列化可以恢复byte [],但这不是一个选项,因为我在sql数据库中使用数据表进行批量插入,反序列化是在运行时完成而没有预先定义Dto(POCO)类。

我可以从数据库中的表定义创建一个Typed DataTable。

我尝试使用ByteJsonConverter,但它无法提供帮助。

您可以查看the complete c# program online以显示问题: 完整跟踪json序列化/反序列化过程。

更新

我使用TypeNameHandling = TypeNameHandling.Objects,将数据类型保存在json中并获取json:

        [
          {
            "f1": {
              "$type": "System.Byte[], mscorlib",
              "$value": "5hAAJEA="
            },
            "f2": "hi all",
            "id": 1
          },
          {
            "f1": {
              "$type": "System.Byte[], mscorlib",
              "$value": "5hrwJEA="
            },
            "f2": "hi world",
            "id": 2
          }
        ]

现在f1的类型为System.Byte [],并且假设DataTableConverter创建了byte []类型的字段而不是字符串。

当我尝试反序列化时,会触发异常错误:

  

读取DataTable时出现意外的JSON令牌:StartObject。路径&#39; [0] .f1&#39;,第3行,第11位

似乎DataTableConverter无法处理$ type / $ value对。

检查the source code

我的问题:

  • 如何解决DataTableConverter的错误。

  • 如何使用Base-64字符串将json字符串反序列化为DataTable中的byte []列。

0 个答案:

没有答案