2012-12-06 45 views
4

我正在尋找將BinaryFormatter序列化之外的內容引入到我的應用程序中以最終與Redis一起使用的方法。 ServiceStack JSON是我想用的,但它可以做我需要的接口嗎? 它可以序列化(通過插入自定義屬性__type)使用ServiceStack.Text序列化接口類型列表

public IAsset Content; 

但不

public List<IAsset> Contents; 

- 列表中出現空序列化的數據。有沒有辦法做到這一點 - 序列化接口類型的列表?

該應用程序是大而古老的,它使用的對象的形狀可能不會被允許改變。 感謝

+0

您可以包括如預期什麼行不通一個完整的示例代碼? – mythz

回答

1

http://www.servicestack.net/docs/framework/release-notes

引用您可能沒有做太多:)

的JSON和JSV文本串行現在支持序列化和 與接口/摘要反序列化的DTO或對象類型。在 其他事情之中,這允許您有一個IInterface屬性,其中 在序列化時將在__type 屬性字段(類似於其他JSON序列化程序)中包含它的具體類型信息,當 序列化時它將填充該具體類型的一個實例 存在)。

[...]

注:此功能會自動添加到所有 抽象/接口/對象類型,即你不需要包括任何 [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 
      }); 
+0

這不正是我在我的問題中寫的嗎?它適用於單個IInterface屬性,但不適用於屬於IInterface對象列表的屬性,並且我需要後者 – lokki

+0

我在閱讀編輯之前編寫了答案,我猜,對不起。 – Hylaean

+0

@lokki:這是否適合你? – Hylaean

相關問題