我用一个字段创建了一个简单的类。 class Test{int value;}
如果我使用“保留引用”功能并将其设置为“all”(即对象和数组),那么当我只是序列化一个Test对象数组时,它会被序列化为一个带有特殊“$”的JSON对象值“具有数组值的成员,以及预期的”$ id“属性以保留数组引用。这很好,但是整个事情再一次打破了反序列化。
单步执行源代码,我发现只是因为“IsReadOnlyOrFixedSize
”的测试为真,它将标志“createdFromNonDefaultConstructor
”设置为true,这甚至没有任何意义,因为虽然它是一个固定大小的数组,但它是从默认构造函数创建的,除非它将任何固定大小的数组构造函数视为非默认构造函数。最重要的是,它应该能够处理如此基本的东西,但却引发了这个错误:“Cannot preserve reference to array or readonly list, or list created from a non-default constructor
”。
如何在保留JSON.NET中的所有引用的同时反序列化基本数组而不会出错?
答案 0 :(得分:2)
遇到同样的问题,我使用List<T>
代替T[]
来修复它。
答案 1 :(得分:1)
您很可能错过了对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);
}
}