我用Json.Net排查(德)序列化問題與下面的類: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設置器。 NumberOfCoinsByType setter永遠不會被調用。
我最好的猜測是反序列化器跟蹤哪些屬性可以通過構造函數設置(通過一些約定,因爲套管似乎被忽略),然後使用屬性設置器填充空位。
這是它的工作方式?反序列化操作/規則的順序是否記錄在某處?