我创建了一个带有一个字段的简单类。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);
}
}