c# - 有或没有自动属性的对象反序列化的差异
问题描述
谁能向我解释为什么要改变
从旧式属性:
[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 的世界......
解决方案
它们几乎相同,但编译器生成的 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;
}
}
我怀疑您使用的任何序列化工具都很乐意写入私有非只读字段,但拒绝写入私有只读字段。
不过,一般来说,最好只序列化专门为序列化而编写的模型。这些模型可以具有公共设置器的属性。
推荐阅读
- c# - 无法获得子文件夹文件的正确文件路径
- raspberry-pi - 创建本地wifi网络RPi + nRF24L01
- javascript - Angular 无法在“RTCPeerConnection”的信号状态“关闭”上执行“createOffer”
- javascript - 这是 useEffect 异步的好习惯吗
- python-3.x - Python 3 - ValueError:无法将字符串转换为浮点数:'-'
- next.js - 下一个 js 10 中的 context.scriptLoader 出错
- python - 如何将 Expect data.index 作为 DatetimeIndex 处理?
- python - 在 panda 2 df 中查看不同形状的差异
- firebase - 将 state 参数设置为 Stripe 查询以传递 FireStore uuid
- python - 将列表扩展到列时复制熊猫数据框而不弄乱它