2014-02-22 2 views
1

다른 하위 목록을 serialize하는 메서드를 만들고 싶습니다. 각 어린이는 자신의 XML 파일을 가져옵니다. 하나의 개체에 대해 이렇게하면 쉽다 :전달 목록 <child>을 인수로 전달 하시겠습니까?

인터페이스를 ISerializable { }

public class Item : ISerializable 
{ 
    public string name { get; set; } 
    public int number { get; set; } 
} 

public class Weapon : ISerializable 
{ 
    public string name { get; set; } 
    public int damage {get; set;} 
} 
public static void SerializeToXML(ISerializable child) 
     { 
      XmlSerializer serializer = new XmlSerializer(child.GetType()); 
      using (TextWriter textWriter = new StreamWriter("test.xml")) 
      { 
       serializer.Serialize(textWriter, child); 
      } 
     } 

내가 원하는 결과를 얻기 위해 직렬화 방법에 ISerializable에서 파생 아무것도 넣을 수 있습니다. 그러나 가능한 인수로 List<ISerializable>을 지정하면 Cannot convert List<item> to List<ISerializable>을 컴파일하지 않습니다. 어쨌든이 문제를 해결하려면?

public static void SerializeListToXML(List<ISerializable> listToXML) 
     { 
      XmlSerializer serializer = new XmlSerializer(listToXML.GetType()); 
      using (TextWriter textWriter = new StreamWriter("test.xml")) 
      { 
       serializer.Serialize(textWriter, listToXML); 
      } 
     } 

내가하는 이유는 훨씬 더 큰 구조의 XML 템플릿을 얻는 것이므로 내 프로그램에 XML을 수동으로 추가하기 위해서입니다. 필자는 serializer를 처음 만들면 처음부터 올바른 XML 구조를 가질 수 있다는 것을 알게되었습니다. 아마도 이것은 나중에 사용자 데이터를 저장하는 줄에 유용 할 수 있습니다.

답변

1

SerializeListToXMLList<Item> 대신 IEnumerable<ISerializable>이되어야합니다.

List<Item>List<ISerializable>으로 주조 할 수 없습니다. 그렇게 할 수 있다면 아이템이 아닌 ISerializable을 목록에 추가 할 수 있습니다. IEnumerable<>을 사용하면 컬렉션을 수정할 수 없으며 컬렉션에 대해서만 반복 할 수 있습니다. SerializeListToXML은 모음을 수정할 필요가 없으므로 덜 제한적인 IEnumerable<ISerializable>을 수락 할 수 있습니다. 공분산 및 반공립에 대한 다음 섹션 및 하위 섹션을 참조하십시오. Covariance and Contravariance

+0

이것이 작동하는 것 같습니다. 감사합니다. 왜 당신 downvote, 아마도 당신은 좀 더 정교한을 가지고있어 확실하지 않습니다. – Madmenyo