http://www.servicestack.net/docs/framework/release-notesからの引用
あなたはおそらく多くをする必要はありません:)
JSON および JSV テキスト シリアライザーは、Interface/Abstract またはオブジェクト タイプを使用した DTO のシリアライズおよびデシリアライズをサポートするようになりました。とりわけ、これにより、シリアル化されたときに具象型情報が __type プロパティ フィールドに含まれる IInterface プロパティを持つことができます (他の JSON シリアライザーと同様)。シリアル化されたときに、その具象型のインスタンスを設定します (存在する場合)。
[...]
注: この機能は、すべての Abstract/Interface/Object タイプに自動的に追加されます。つまり、この機能を利用するために [KnownType] 属性を含める必要はありません。
それほどではありません:
public interface IAsset
{
string Bling { get; set; }
}
public class AAsset : IAsset
{
public string Bling { get; set; }
public override string ToString()
{
return "A" + Bling;
}
}
public class BAsset : IAsset
{
public string Bling { get; set; }
public override string ToString()
{
return "B" + Bling;
}
}
public class AssetBag
{
[JsonProperty(TypeNameHandling = TypeNameHandling.None)]
public List<IAsset> Assets { get; set; }
}
class Program
{
static void Main(string[] args)
{
try
{
var bag = new AssetBag
{
Assets = new List<IAsset> {new AAsset {Bling = "Oho"}, new BAsset() {Bling = "Aha"}}
};
string json = JsonConvert.SerializeObject(bag, new JsonSerializerSettings()
{
TypeNameHandling = TypeNameHandling.Auto
});
var anotherBag = JsonConvert.DeserializeObject<AssetBag>(json, new JsonSerializerSettings()
{
TypeNameHandling = TypeNameHandling.Auto
});