servicestack,C#,Json,Serialization,servicestack" /> servicestack,C#,Json,Serialization,servicestack" />

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

C# 使用ServiceStack.Text序列化接口类型列表,c#,json,serialization,servicestack,C#,Json,Serialization,servicestack,我正在寻找将BinaryFormatter序列化以外的东西引入我的应用程序的方法,以最终与Redis一起使用。ServiceStack JSON是我想要使用的,但它能满足我对接口的需求吗? 它可以序列化(通过插入自定义类型属性) 但不是 public List<IAsset> Contents; 公开列表内容; -列表在序列化数据中显示为空。有没有办法做到这一点-序列化接口类型列表 这个应用程序又大又旧,它使用的对象的形状可能不会被允许改变。 谢谢你引用我的话 您可能不需要做太多

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

但不是

public List<IAsset> Contents;
公开列表内容;
-列表在序列化数据中显示为空。有没有办法做到这一点-序列化接口类型列表

这个应用程序又大又旧,它使用的对象的形状可能不会被允许改变。 谢谢你引用我的话

您可能不需要做太多:)

JSON和JSV文本序列化程序现在支持序列化和 使用接口/抽象或对象类型反序列化DTO。在 其他方面,这允许您拥有一个接口属性 序列化时,将在_类型中包含其具体类型信息 属性字段(类似于其他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
            });
公共接口IASet
{
字符串{get;set;}
}
公共类AAsset:IAsset
{
公共字符串{get;set;}
公共重写字符串ToString()
{
返回“A”+闪烁;
}
}
公共类BAsset:IAsset
{
公共字符串{get;set;}
公共重写字符串ToString()
{
返回“B”+闪烁;
}
}
公共类资产包
{
[JsonProperty(TypeNameHandling=TypeNameHandling.None)]
公共列表资产{get;set;}
}
班级计划
{
静态void Main(字符串[]参数)
{
尝试
{
var行李=新资产行李
{
资产=新列表{new AAsset{Bling=“Oho”},new BAsset(){Bling=“Aha”}
};
string json=JsonConvert.SerializeObject(包,新的JsonSerializerSettings()
{
TypeNameHandling=TypeNameHandling.Auto
});
var anotherBag=JsonConvert.DeserializeObject(json,新的JsonSerializerSettings()
{
TypeNameHandling=TypeNameHandling.Auto
});

您能否提供一个完整的示例代码,说明哪些部分无法按预期工作?这不正是我在问题中所写的吗?它适用于单个IInterface属性,但不适用于IInterface对象列表的属性,我需要后者
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
            });