我正在使用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之后的效果。这也解决了问题。
最后,我从自动属性切换到带有后备字段的属性,以便我完全调试并看到实际发生了什么:
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;
}
}
我尝试过使用默认构造函数和不使用默认构造函数(代码省略了默认构造函数)。
使用默认构造函数:首先调用默认构造函数,然后调用两个属性的setter方法。
不使用默认构造函数:首先调用非默认构造函数,然后调用WithDrawlDate的setter方法。NumberOfCoinsByType的setter方法从未被调用。
我猜测反序列化程序会记录哪些属性可以通过构造函数设置(根据某种约定,因为似乎大小写被忽略),然后在可能的情况下使用属性的setter方法来填补空缺。
这是它的工作方式吗?反序列化的操作顺序/规则在哪里有记录?