我想创建一个非常通用的模型层,它也可以作为 JSON 传递。一个模型应该显示 RaspberryPi2 的 LED 面板。由于我想将类建模为尽可能接近现实,因此我强制列表始终具有 8 * 8 个 LED。该类看起来像这样:
public class VisualLedPanel
{
private readonly Lazy<List<VisualLed>> _lazyVisualLeds = new Lazy<List<VisualLed>>(CreateVisualLeds);
public VisualLed this[int x, int y]
{
get
{
var result = VisualLeds.FirstOrDefault(f => f.X == x && f.Y == y);
return result;
}
}
public IEnumerable<VisualLed> VisualLeds
{
get
{
return _lazyVisualLeds.Value;
}
set
{
var tt = value;
}
}
private static List<VisualLed> CreateVisualLeds()
{
var result = new List<VisualLed>();
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,这会导致逻辑创建 LED,然后再设置它们。 我能想到的唯一解决方案是自定义反序列化器或某种构造函数 shennnigans。 反序列化器似乎也没有使用 VisualLeds-Value 的 Set-Property,因为我的 Debugger-Stop 从未被击中。
是否有可能轻松地兼顾两全其美?我想让模型尽可能通用,而不需要自定义反序列化器。
最佳答案
无需自己编写即可执行此操作的最简单方法 custom JsonConverter
将序列化您收藏的 VisualLed
对象作为代理 array 属性,将原始属性标记为 ignored :
public class VisualLedPanel
{
private readonly Lazy<List<VisualLed>> _lazyVisualLeds = new Lazy<List<VisualLed>>(CreateVisualLeds);
public VisualLed this[int x, int y]
{
get
{
var result = VisualLeds.FirstOrDefault(f => f.X == x && f.Y == y);
return result;
}
}
[JsonIgnore]
public IEnumerable<VisualLed> 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<VisualLed> CreateVisualLeds()
{
var result = new List<VisualLed>();
for (var x = 0; x <= 7; x++)
{
for (var y = 0; y <= 7; y++)
{
result.Add(new VisualLed(x, y));
}
}
return result;
}
}
原型(prototype) fiddle
有关进一步的讨论,请参阅 Why are all the collections in my POCO are null when deserializing some valid json with the .NET Newtonsoft.Json component .使用 ObjectCreationHandling.Replace
在这种情况下不合适,因为您想要 Lazy<List<VisualLed>> _lazyVisualLeds
为只读。
关于c# - 反序列化导致列表条目的副本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36314523/