2016-05-10 104 views
0

的XML序列化我有数据结构的以下样式:的WebAPI 2继承和隐藏属性

class OtherSummary { ... } 

class OtherFullData : OtherSummary { ... } 

class Summary 
{ 
    public string Name { get; set; } 
    public IEnumerable<OtherSummary> Stuff { get; set; } 
} 

class FullData : Summary 
{ 
    // hide the base member because we want full data in this class. 
    public new IEnumerable<OtherFullData> Stuff { get; set; } 
} 

在我的Web API 2控制器,有些方法返回汇总对象,而另一些返回FullData对象。这一切似乎工作,除了当返回一个FullData对象时,XML中有两个节点用于“Stuff”属性(编辑:如果输出是XML - 在JSON中看起来很好)。
一个总是空的,所以我只能假设这是被序列化的隐藏基础属性?

我不以任何方式修改api的序列化输出。
控制器方法都或多或少:

public IHttpActionResult Search(string term) 
{ 
    // do the search and map to summary objects ... 
    return this.Ok(summaryData); 
} 
// returns as expected: 
<Summary> 
    <Name>xyz</Name> 
    <Stuff> 
     <OtherSummary>...</OtherSummary> 
    </Stuff> 
</Summary> 

public IHttpActionResult Get(int id) 
{ 
    // get data and map to a full object ... 
    return this.Ok(fullData); 
} 
// returns with phantom Stuff node: 
<Summary> 
    <Name>xyz</Name> 
    <Stuff /> 
    <Stuff> 
     <OtherFullData>...</OtherFullData> 
    </Stuff> 
</Summary> 

我真的希望这是作为出的现成的可能,所以没有进入编写自定义的合同解析器或东西,我失去了简单的东西,以防止这个?我原以为隐藏的财产不会被序列化。

或者,我将摘要和完整对象分开,尽管这样做有相当多的重复。

回答

1

我建议通用的方法来代替:

class Summary<T> where T : OtherSummary 
{ 
    public string Name { get; set; } 
    public IEnumerable<T> Stuff { get; set; } 
} 

class FullData : Summary<OtherFullData> 
{ 
} 

没有必要隐瞒......

+0

对不起,在接受答案的延迟,该项目已移动了一点,因为我张贴的问题并测试出来相当复杂,但它确实有效! –