2012-04-11 20 views
0

Ich weiß, dass Sie nicht mit einer Schnittstelle serialisieren/deserialize, aber ich bin verwirrt durch Verhalten, das ich sehe.XmlSerialization und Schnittstellen

Wenn ich deserialize und an die Schnittstelle zurückgeworfen habe, sind einige Eigenschaften null. Aber wenn ich auf den konkreten Typ zurückgeworfen habe, hat die gleiche Eigenschaft einen Wert?

So gegeben, diese XML (der Kürze halber verkürzt):

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

Deserialisieren mit

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

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

Aber wenn ich zurückgeworfen auf die Art,

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

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

Der Seitentyp macht die Schnittstelle Kategorien Eigenschaft und eine Nicht-Schnittstelle Eigenschaft - ich nehme an, um die Serialisierung interf zu umgehen ein Problem.

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

Liegt das daran, dass die Interface-Eigenschaft keinen Setter aussetzt?

Antwort

1

No. Das Problem ist Kontra nicht durch List<T> und IList<T> unterstützt. Here ist eine gute Referenz.


Werfen Sie einen Blick auf diesen einfachen Code:

public interface IMyInterface 
{ 

} 

public class MyImplementation : IMyInterface 
{ 

} 

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

So wie Sie sehen können, werden Categories as IList<ICategory> immer null sein. Während Categories as IList<Category> wird OK sein.

Nichts mit Serialisierung zu tun.

+0

Große Antwort! Ab jetzt über Kontravarianz zu lesen! – Neil

+0

@Neil mit 'IEnumerable ' gibt Ihnen die Funktion, die Sie benötigen. – Aliostad