内部ディクショナリを使用してオブジェクトを適切にシリアライズ/デシリアライズしようとすると問題が発生します。ディクショナリにはPairIntKey
、キーとしていくつかのカスタム型があります。
コードは次のとおりです。
public class MyClassWithDictionary
{
private Dictionary<PairIntKey, List<int>> _myDictionary = new Dictionary<PairIntKey, List<int>>();
public Dictionary<PairIntKey, List<int>> MyDictionary
{
set { _myDictionary = value; }
}
public void AddElementsToMyDictionary(PairIntKey key, List<int> value)
{
_myDictionary.Add(key, value);
}
}
public class PairIntKey : IEquatable<PairIntKey>
{
private int _value1;
private int _value2;
public int Value1
{
get { return _value1; }
}
public int Value2
{
get { return _value2; }
}
public PairIntKey(int value1, int value2)
{
_value1 = value1;
_value2 = value2;
}
public override int GetHashCode()
{
return _value1 + 29 * _value2;
}
public bool Equals(PairIntKey other)
{
if (this == other) return true;
if (other == null) return false;
if (_value1 != other._value1) return false;
if (_value2 != other._value2) return false;
return true;
}
public override string ToString()
{
return String.Format("({0},{1})", _value1, _value2);
}
}
このように連載しています
public void SerializeAndDeserializeMyObject()
{
var myObject = new MyClassWithDictionary();
myObject.AddElementsToMyDictionary(new PairIntKey(1, 1), new List<int> {5});
var contractResolver = new DefaultContractResolver();
contractResolver.DefaultMembersSearchFlags |= BindingFlags.NonPublic;
string serializedItem = JsonConvert.SerializeObject(myObject,
Formatting.Indented,
new JsonSerializerSettings()
{
ContractResolver = contractResolver,
});
var deserializedItem = JsonConvert.DeserializeObject(serializedItem, typeof(MyClassWithDictionary), new JsonSerializerSettings()
{
ContractResolver = contractResolver,
});
}
serializedItem
のように見える
{
"_myDictionary": {
"(1,1)": [
5
]
}
}
問題は、メンバーdeserializedItem
が空であることです。MyDictionary
Json.Net が文字列 "(1,1)" をPairIntKey
クラス インスタンスに変換する方法を知らないとすぐに、そのことは明らかです。その場合に適切なコンバーターを作成するにはどうすればよいですか? それともコンバーターであってはいけませんか?