2012-04-11 4 views
0

인터페이스를 사용하여 serialize/deserialize 할 수 없다는 것을 알고 있지만 동작이 혼란 스럽습니다.XmlSerialization 및 interfaces

역 직렬화하여 인터페이스로 다시 캐스트 할 때 일부 속성은 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 속성과 비 인터페이스 속성을 노출합니다. - serialize interf 에이스 문제.

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>은 괜찮습니다.

과 아무 관련이 없습니다.

+0

위대한 답변! 지금 contravariance에 대해 읽으 려구요! – Neil

+0

@Neil은'IEnumerable '을 사용하여 필요한 기능을 제공합니다. – Aliostad

관련 문제