次のオブジェクトをシリアル化したい:
class Zoo
{
public List<Animal> Animals { get; set; }
}
class Animal
{
public Animal(string name)
{
Name = name;
}
public string Name { get; private set; }
}
class Dog : Animal
{
public Dog(string name) : base(name)
{
}
}
class Cat : Animal
{
public Cat(string name) : base(name)
{
}
}
カスタム バインダーを使用して JSON との間でシリアル化/逆シリアル化することは問題ではありません。
var settings = new JsonSerializerSettings
{
TypeNameHandling = TypeNameHandling.Auto,
Binder = binder
};
string json = JsonConvert.SerializeObject(zoo, settings);
var deserialized = JsonConvert.DeserializeObject<Zoo>(json, settings);
カスタム バインダーの BindToType/BindToName メソッドの両方が、シリアル化/逆シリアル化中に呼び出されます。
BSON で同じ手法を試しましたが、残念ながらうまくいきません。結果は Zoo オブジェクトではなく、JObject です。結果ストリームに型情報が含まれておらず、逆シリアル化中にバインダーが呼び出されないようです。
任意の提案をいただければ幸いです。