首页 > 解决方案 > 序列化集合正在转换为 JObject 而不是 JArray

问题描述

我有一种方法可以序列化 BSON 格式的数据对象 - 它运行良好。我试图扩展该方法,以便可以在集合上使用它,但是在反序列化数据时遇到了问题。我的序列化方法如下所示:

public byte[] SerializeCollection(T[] items)
{
    JsonConvert.SerializeObject(items);

    using (MemoryStream ms = new MemoryStream())
    {
        using (BsonDataWriter writer = new BsonDataWriter(ms))
        {
            JsonSerializer serializer = new JsonSerializer();
            serializer.Serialize(writer, items, typeof(T[]));
        }
        return ms.ToArray();
    }
}

我的反序列化方法是这样的:

public T[] DeserializeCollection(byte[] bytes, JsonSerializerSettings settings)
{
    using (MemoryStream ms = new MemoryStream(bytes))
    {
        using (BsonDataReader reader = new BsonDataReader(ms))
        {
            JsonSerializer serializer = new JsonSerializer();
            return serializer.Deserialize<T[]>(reader);
        }
    }
}

我发现的是,当我反序列化对象时,它会中断serializer.Deserialize<T[]>(reader)消息:

Newtonsoft.Json.JsonSerializationException:'无法将当前 JSON 对象(例如 {"name":"value"})反序列化为类型 'ServiceBusSerialisationTests.Models.TestEventModel[]',因为该类型需要 JSON 数组(例如 [1,2, 3])正确反序列化。要修复此错误,要么将 JSON 更改为 JSON 数组(例如 [1,2,3]),要么将反序列化类型更改为普通的 .NET 类型(例如,不是像整数这样的原始类型,而不是像这样的集合类型可以从 JSON 对象反序列化的数组或列表。JsonObjectAttribute 也可以添加到类型中以强制它从 JSON 对象反序列化。路径“0”。

深入挖掘这似乎是因为序列化问题。当对象被序列化时,它实际上变成了单个对象而不是数组。IE

{ 0: {}, 1: {}, 2: {}, ...}

而不是

[{}, {}, {}, ...]

我可以做些什么来正确地将对象序列化 - 作为一个数组 - 或者将它从对象反序列化回一个数组?

我正在使用 .Net Core 2.2 和 Newtonsoft.Json.Bson 1.0.2。

标签: c#serialization.net-corejson.netdeserialization

解决方案


推荐阅读