【发布时间】:2015-10-13 16:21:44
【问题描述】:
我正在使用 Json.Net 对以下类的(反)序列化问题进行故障排除:
public class CoinsWithdrawn
{
public DateTimeOffset WithdrawlDate { get; private set; }
public Dictionary<CoinType, int> NumberOfCoinsByType { get; private set; }
public CoinsWithdrawn(DateTimeOffset withdrawDate, Dictionary<CoinType, int> numberOfCoinsByType)
{
WithdrawlDate = withdrawDate;
NumberOfCoinsByType = numberOfCoinsByType;
}
}
问题在于构造函数参数“withdrawDate”的命名与属性名称“WithDrawlDate”不同。使名称匹配(即使忽略大小写)解决了这个问题。
但是,我想更好地理解这一点,所以我在公开两个 setter 后恢复了代码并进行了测试。这也解决了问题。
最后,我从自动属性切换到带有支持字段的属性,以便完全调试并查看实际发生的情况:
public class CoinsWithdrawn
{
private DateTimeOffset _withdrawlDate;
private Dictionary<CoinType, int> _numberOfCoinsByType;
public DateTimeOffset WithdrawlDate
{
get { return _withdrawlDate; }
set { _withdrawlDate = value; }
}
public Dictionary<CoinType, int> NumberOfCoinsByType
{
get { return _numberOfCoinsByType; }
set { _numberOfCoinsByType = value; }
}
public CoinsWithdrawn(DateTimeOffset withdrawDate, Dictionary<CoinType, int> numberOfCoinsByType)
{
WithdrawlDate = withdrawDate;
NumberOfCoinsByType = numberOfCoinsByType;
}
}
我尝试了使用和不使用默认构造函数(显示的代码省略了默认构造函数)。
使用默认构造函数:调用默认构造函数,然后调用两个属性设置器。
没有默认构造函数:调用非默认构造函数,然后调用WithDrawlDate setter。永远不会调用 NumberOfCoinsByType 设置器。
我最好的猜测是,反序列化器会跟踪可以通过构造函数设置哪些属性(按照某种约定,因为似乎忽略了大小写),然后在可能的情况下使用属性设置器来填补空白。
这是它的工作方式吗?反序列化的操作顺序/规则是否记录在某处?
【问题讨论】:
标签: c# json serialization json.net