c# - 反序列化导致列表条目的副本

标签 c# json serialization

我想创建一个非常通用的模型层,它也可以作为 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/

相关文章:

java - 如何将输出格式化为正确的 json 格式?

php - 创建一种从 JSON 日期时间搜索日期范围的方法

c# - json.net c# - 如何设置 json 字典键名?

c# - 将 "old"xml 反序列化为新的类实例

JSON4S 类型提示不起作用

c# - 如何更正表达式的替换类型?

c# - Task 和 FrameworkElement 参数的词法绑定(bind)

c# - 将图像作为解析文件上传

c# - 将 IEnumerable 添加到 ViewState

symfony - 在 symfony2 中创建 JMS Serializer 处理程序