【问题标题】:WCF Return list of baseclass objects containing derived classWCF 返回包含派生类的基类对象列表
【发布时间】:2013-08-04 18:34:16
【问题描述】:

我有一个返回所有蛇的函数。看起来像这样并且工作正常:

// Function that returns JSON list of snakes
public List<Snake> GetSnakes()
{
    var snakes = new List<Snakes>();
    snakes.Add(new Snake { Length = "10.2" } );
    return snakes;
}

现在我得到了一堆具有不同属性的动物,我不想为每一个都列出一个清单。我想要这样的东西:

public class AnimalService : IAnimalService
{
    private List<Animal> animals = new List<Animals>();

    public List<Animal> getSnakes()
    {
        animals.Add(new Snake { Name = "Snake" } );
        return animals;
    }

    public List<Animal> getPigs()
    {
        animals.Add( new Pig { Weight = "100" } );
        return animals;
    }
}

但这不起作用。当我将派生类添加到我的动物列表时,WCF 服务停止为该函数生成 JSON 并且不返回任何内容。没有错误或任何东西,但没有结果。我怎样才能达到我想要的?一个列表包含一组返回的动物,不管是什么类型。

【问题讨论】:

    标签: c# json wcf


    【解决方案1】:

    尝试将KnownTypeAttribute 添加到您想要序列化的每个子类的Animal 类中:

    [DataContract]
    [KnownType(typeof(Snake))]
    [KnownType(typeof(Pig))]
    public class Animal 
    {
    }
    

    【讨论】:

    • 这成功了!但我确实得到了一个 akward json 属性,如下所示:“__type”:“Snake:#AnimalDatabase.Snakes”。你知道如何删除它吗?
    • 数据来自数据库,但我没有任何名为 __type 的属性
    • @Hasslarn 这是DataContractJsonSerializer 区分不同C# 类的副作用。如果不编写可以完成的不同序列化程序,我认为您无法做到,但这是相当多的工作。
    • 序列化后是否可以手动移除?
    • 我最终使用 JSON.Net 进行序列化,它没有 type 属性
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多