我试图使用 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 对象(例如 {"名称":"值"}) 成类型 'System.Collections.Concurrent.ConcurrentBag'1[System.Int32]' 因为 该类型需要一个 JSON 数组(例如 [1,2,3])来反序列化 正确。若要修复此错误,请将 JSON 更改为 JSON 数组 (例如 [1,2,3]) 或更改反序列化类型,使其为正常类型 .NET 类型(例如,不是像整数这样的基元类型,不是集合 类型,类似于数组或列表),可以从 JSON 反序列化 对象。JsonObjectAttribute 也可以添加到类型中以强制它 从 JSON 对象反序列化。路径"0"。
如果我不将类型作为第二个参数传递给反序列化程序,那很好,但我有一个通用对象作为输出。
有人知道为什么会这样吗?
我的猜测是你想在序列化之前将该包转换为数组。 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);
}