5

最終的にRedisで動作するように、BinaryFormatterシリアル化以外のものをアプリに導入する方法を検討しています。ServiceStack JSONは私が使用したいものですが、インターフェイスで必要なことを実行できますか?シリアル化できます(カスタム__type属性を挿入することにより)

public IAsset Content;

だがしかし

public List<IAsset> Contents;

-シリアル化されたデータではリストが空になります。これを行う方法はありますか?インターフェイスタイプのリストをシリアル化しますか?

アプリは大きくて古く、使用するオブジェクトの形状はおそらく変更できません。ありがとう

4

1 に答える 1

1

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
            });
于 2012-12-06T15:50:51.437 に答える