反序列化会导致List-Entries的副本

我想创建一个非常通用的Model-Layer,它也可以作为JSON传递。 一个型号应该显示一个RaspberryPi2的LED面板。 因为我想将Class建模为尽可能接近现实,所以我强制List总是有8 * 8 Leds。 class级看起来像这样:

public class VisualLedPanel { private readonly Lazy<List> _lazyVisualLeds = new Lazy<List>(CreateVisualLeds); public VisualLed this[int x, int y] { get { var result = VisualLeds.FirstOrDefault(f => fX == x && fY == y); return result; } } public IEnumerable VisualLeds { get { return _lazyVisualLeds.Value; } set { var tt = value; } } private static List CreateVisualLeds() { var result = new List(); for (var x = 0; x <= 7; x++) { for (var y = 0; y <= 7; y++) { result.Add(new VisualLed(x, y)); } } return result; } } 

序列化出现了问题:我正在使用NewtonSoft。 Json.Net Serializer,据我所知,它首先访问Getter,这会导致Logic创建Leds,然后设置它们。 我能想到的唯一解决方案可能是Custom-Deserializer或某种Constructor shennenigans。 看起来Deserializer似乎没有使用VisualLeds-Value的Set-Property,因为我的Debugger-Stop从未被命中过。

是否有一个简单的可能性来充分利用这两个世界? 我希望模型尽可能通用,而不需要Custom-Deserializer。

在不必编写自定义JsonConverter情况下,最简单的方法是将VisualLed对象集合序列化为代理数组属性,将原始属性标记为忽略 :

 public class VisualLedPanel { private readonly Lazy> _lazyVisualLeds = new Lazy>(CreateVisualLeds); public VisualLed this[int x, int y] { get { var result = VisualLeds.FirstOrDefault(f => fX == x && fY == y); return result; } } [JsonIgnore] public IEnumerable VisualLeds { get { return _lazyVisualLeds.Value; } } [JsonProperty("VisualLeds")] VisualLed [] SerializableVisualLeds { get { return VisualLeds.ToArray(); } set { if (value == null || value.Length == 0) { if (_lazyVisualLeds.IsValueCreated) _lazyVisualLeds.Value.Clear(); } else { _lazyVisualLeds.Value.Clear(); _lazyVisualLeds.Value.AddRange(value); } } } private static List CreateVisualLeds() { var result = new List(); for (var x = 0; x <= 7; x++) { for (var y = 0; y <= 7; y++) { result.Add(new VisualLed(x, y)); } } return result; } } 

原型小提琴

有关进一步的讨论,请参阅使用.NET Newtonsoft.Json组件反序列化某些有效的json时 , 为什么我的POCO中的所有集合都为null 。 在这种情况下使用ObjectCreationHandling.Replace是不合适的,因为您希望Lazy> _lazyVisualLeds是只读的。