JSON.NET无法处理简单的数组反序列化



我创建了一个带有一个字段的简单类。class Test{int value;}

如果我使用"保留引用"功能并将其设置为"所有"(即对象和数组),那么当我简单地序列化一个测试对象数组时,它会被序列化为一个JSON对象,其中包含一个带有数组值的特殊"$values"成员,以及预期的"$id"属性以保留数组引用。这么多还可以,但在反序列化时,整个事情又一次崩溃了。

通过查看源代码,我发现,仅仅因为"IsReadOnlyOrFixedSize"的测试为true,它就将标志"createdFromNonDefaultConstructor"设置为true,这甚至没有任何意义,因为尽管它是一个固定大小的数组,但它是从默认构造函数创建的,除非它将任何固定大小的阵列构造函数视为非默认构造函数。最重要的是,它应该能够处理一些如此基本的东西,但它却抛出了这个错误:"Cannot preserve reference to array or readonly list, or list created from a non-default constructor"。

如何在保留JSON.NET中的所有引用的同时反序列化基本数组而不出错?

遇到同样的问题,我使用List<T>而不是T[]来修复它。

您很可能缺少对ToObject(...)的调用和类型转换。这应该有效:

class Test { public int Value; }
class Program
{
    static void Main(string[] args)
    {
        var array = new Test[2];
        var instance = new Test {Value = 123};
        array[0] = instance;
        array[1] = instance;
        var settings = new JsonSerializerSettings
        {
            PreserveReferencesHandling = PreserveReferencesHandling.All
        };
        string serialized = JsonConvert.SerializeObject(array, settings);
        // Explicitly call ToObject() and cast to the target type
        var deserialized = (Test[]) ((JArray)JsonConvert.DeserializeObject(serialized, settings)).ToObject(typeof(Test[]));
        Debug.Assert(deserialized[0].Value == 123);
    }
}

相关内容

  • 没有找到相关文章