2012-04-11 13 views
0

インターフェイスを使用してシリアライズ/デシリアライズできないことがわかりますが、私が見ている動作によって混乱します。Xmlシリアル化とインターフェイス

デシリアライズしてインターフェイスにキャストバックすると、いくつかのプロパティは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>; } 
} 

これはインターフェイスのプロパティがセッターを公開しないためですか?

答えて

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>は常にnullになります。 Categories as IList<Category>はOKです。

シリアル化とは関係ありません

+0

偉大な答え!今contravarianceについて読むことをオフに! – Neil

+0

@Neilで 'IEnumerable 'を使うと、必要な機能が得られます。 – Aliostad