首页 > 解决方案 > 有或没有自动属性的对象反序列化的差异

问题描述

谁能向我解释为什么要改变

从旧式属性:

[Serializable]
public class Foo
{
    private List<Bar> _BarList = new List<Bar>();

    public List<Bar> BarList
    {
        get
        {
            return _BarList;
        }
    }
}

自动属性:


[Serializable]
public class Foo
{
    public List<Bar> BarList { get; } = new List<Bar>();
}

会改变反序列化行为吗?在此更改之后,BarList 属性将始终反序列化为 NULL。

我一直认为这只是语法糖,但我没有足够的勇气潜入 IL 的世界......

标签: c#

解决方案


它们几乎相同,但编译器生成的 auto-prop 支持字段是readonly(并且有[CompilerGenerated]它):

[CompilerGenerated]
[DebuggerBrowsable(DebuggerBrowsableState.Never)]
private readonly List<Bar> <BarList>k__BackingField = new List<Bar>();

public List<Bar> BarList
{
    [CompilerGenerated]
    get
    {
        return <BarList>k__BackingField;
    }
}

夏普实验室

我怀疑您使用的任何序列化工具都很乐意写入私有非只读字段,但拒绝写入私有只读字段。

不过,一般来说,最好只序列化专门为序列化而编写的模型。这些模型可以具有公共设置器的属性。


推荐阅读