2012-04-11 59 views
0

我知道你不能使用接口序列化/反序列化,但我很困惑我看到的行爲。XmlSerialization和接口

當我反序列化並轉回到接口時,某些屬性爲null。但是如果我回到具體類型,相同的屬性有一個值?

因此,鑑於這種XML(簡稱爲簡潔起見):

<Page> 
    <ComponentPresentations> 
    <ComponentPresentation> 
     <Component> 
     <Categories> 
      <Category> 
      <Id>tcm:35-540-512</Id> 

反序列化與

var serializer = new XmlSerializer(typeof(Page)); 
page = (IPage)serializer.Deserialize(reader); 

page.ComponentPresentations[0].Component.Categories <-- is null 

但是,如果我投回型,

var serializer = new XmlSerializer(typeof(Page)); 
page = (Page)serializer.Deserialize(reader); 

page.ComponentPresentations[0].Component.Categories <-- is not null! 

頁類型暴露了接口Categories屬性和一個非接口屬性 - 我假設要繞過序列化接口王牌問題。

public List<Category> Categories { get; set; } 
[XmlIgnore] 
IList<ICategory> IComponent.Categories 
{ 
    get { return Categories as IList<ICategory>; } 
} 

這是因爲接口屬性不公開setter?

回答

1

號的問題是逆變沒有被List<T>IList<T>支持。 Here是一個很好的參考。


看一看這個簡單的代碼:

public interface IMyInterface 
{ 

} 

public class MyImplementation : IMyInterface 
{ 

} 

List<MyImplementation> myImplementations = new List<MyImplementation>(); 
Console.WriteLine(myImplementations as IList<IMyInterface> == null); // OUTPUT: true!! 

因此,大家可以看到,Categories as IList<ICategory>永遠是零。而Categories as IList<Category>會好的。

與序列化無關

+0

很好的答案!現在就閱讀關於逆變的內容! – Neil 2012-04-11 15:58:27

+0

@Neil使用IEnumerable '會給你你需要的功能。 – Aliostad 2012-04-11 16:07:13