您的问题是,您要反序列化的属性在对象图中获取并设置了 代理
集合,而不是“真实”集合。这样做违反了Json.NET用于构造和填充返回参考类型对象,集合和词典的属性的算法的实现决策。该算法是:
它在父类中调用getter以获取要反序列化的属性的当前值。
如果为null,并且除非使用自定义构造函数,否则它将分配属性的返回类型的实例(使用该类型的
JsonContract.DefaultCreator
方法)。它调用父级中的setter,以将分配的实例设置回父级中。
它将继续填充类型的实例。
实例填充后,它不会将实例再次设置回第二次。
在开始时调用getter可以填充类型的实例(例如使用
JsonConvert.PopulateObject()),然后递归地填充该类型所引用的其他类型的任何预分配实例。(这就是中的
existingValue参数的目的
JsonConverter.ReadJson()。)
但是,以这种方式填充预分配的对象图的能力是有代价的:图中遇到的每个对象必须是 真实
对象,而不是为序列化目的创建的某些代理对象。如果getter返回的对象只是某个代理,则将填充该代理,而不填充“真实”对象-
除非该代理具有某种机制,以将对其数据的更改传递回其始发者。
ObjectCreationHandling =ObjectCreationHandling.Replace如您所见,更改了该算法,以便对集合进行分配,填充和设置。这是启用代理集合反序列化的一种方法。
作为另一个解决方法,您可以选择序列化和反序列化代理 数组 :
[JsonIgnore]public List<Media> Images{ get { return new List<Media> { new Media{..}, new Media{..} }; } set { AddImages(value); }}[JsonProperty("Images")] // Could be privateMedia [] ImagesArray{ get { return Images.ToArray(); } set { AddImages(value); }}对于数组,Json.NET(和
XmlSerializer) 必须
在完全读取数组之后调用setter,因为在完全读取之前无法知道大小,因此无法分配数组并在完全读取之前将其设置回去。
(您也可以使用代理技巧
ObservableCollection,但是我不推荐这样做。)



