【问题标题】:JSON.NET cannot Deserialize ConcurrentBagJSON.NET 无法反序列化 ConcurrentBag
【发布时间】:2023-03-19 00:21:01
【问题描述】:

我尝试使用 JSON.NET 序列化和反序列化 ConcurrentBag:

 var bag = new ConcurrentBag<int>(){2};
 var jsonSerializer = new JsonSerializer();
 using(var aStream = new MemoryStream())
 { 
    var sw = new BsonWriter(aStream); 
    jsonSerializer.Serialize(sw, bag);

    aStream.Position = 0;   

    var rw = new BsonReader(aStream);        
    jsonSerializer.Deserialize(rw,bag.GetType()); 
 }

我得到了这个例外:

无法反序列化当前 JSON 对象(例如 {"name":"value"}) 输入类型 'System.Collections.Concurrent.ConcurrentBag`1[System.Int32]' 因为 该类型需要一个 JSON 数组(例如 [1,2,3])来反序列化 正确。要修复此错误,请将 JSON 更改为 JSON 数组 (例如 [1,2,3])或更改反序列化类型,使其成为正常的 .NET 类型(例如,不是像整数这样的原始类型,也不是集合 可以从 JSON 反序列化的数组或列表等类型 目的。 JsonObjectAttribute 也可以添加到类型中来强制它 从 JSON 对象反序列化。路径“0”。

如果我不将类型作为第二个参数传递给反序列化器,那很好,但我有一个通用对象作为输出。

有人知道为什么会这样吗?

【问题讨论】:

    标签: .net json c#-4.0 json.net deserialization


    【解决方案1】:

    我的猜测是您想在序列化之前将该包转换为数组。 JSON.NET 的功能可能不够全面,无法为所有 System.Concurrent 集合类型提供例程(而且它可能不应该是——这些类型是实现细节)。在你的情况下,你可能想尝试这样的事情:

    // Add a "using System.Linq" somewhere above...
    var bag = new ConcurrentBag<int>(){2};
    var jsonSerializer = new JsonSerializer();
    using(var aStream = new MemoryStream())
    { 
       var sw = new BsonWriter(aStream); 
       jsonSerializer.Serialize(sw, bag.ToArray());
    
       aStream.Position = 0;   
    
       var rw = new BsonReader(aStream);        
       var intArray = jsonSerializer.Deserialize(rw, typeof(int[])); 
       var deserializedBag = new ConcurrentBag<int>(intArray); 
    }
    

    【讨论】:

    • 不幸的是引发了同样的异常
    猜你喜欢
    • 2023-03-24
    • 2019-04-08
    • 1970-01-01
    • 2013-11-14
    • 2012-04-09
    • 1970-01-01
    • 2017-04-10
    • 2020-03-09
    相关资源
    最近更新 更多