使用ServiceStack.Text序列化接口类型列表

时间:2012-12-06 15:37:29

标签: c# json serialization servicestack

我正在寻找将BinaryFormatter序列化以外的东西引入我的应用程序以最终与Redis一起使用的方法。 ServiceStack JSON是我想要使用的,但它可以用接口做我需要的吗? 它可以序列化(通过插入自定义__type属性)

public IAsset Content;

但不是

public List<IAsset> Contents;

- 序列化数据中的列表显示为空。有没有办法做到这一点 - 序列化接口类型列表?

应用程序大而旧,它使用的对象形状可能不会被允许更改。 感谢

1 个答案:

答案 0 :(得分:1)

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

你可能不需要做太多的事情:)。

  

JSON和JSV Text序列化程序现在支持序列化和   使用Interface / Abstract或对象类型反序列化DTO。当中   其他的东西,这允许你有一个IInterface属性   序列化时,将在__type中包含其具体类型信息   属性字段(类似于其他JSON序列化程序)当时   serialized填充该具体类型的实例(提供它   存在)。

     

[...]

     

注意:此功能会自动添加到所有人   抽象/接口/对象类型,即您不需要包含任何类型   [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
            });