2012-03-14 6 views
3

일부 XML을 IList로 deserialize하려고하는데 문제가 있습니다.XML을 IList에 deserialize C#

는 XML : :

<?xml version="1.0" encoding="utf-8"?> 

<Animals> 
    <Animal> 
     <Name>Cow</Name> 
     <Color>Brown</Color> 
    </Animal> 
</Animals> 

모델 :

[XmlRoot("Animals")] 
public class Model 
{ 
    [XmlElement("Animal")] 
    public List<Animal> AnimalList { get; set; } 
} 

public class Animal 
{ 
    [XmlElement("Name")] 
    public string Name{ get; set; } 
    [XmlElement("Color")] 
    public string Color{ get; set; } 
} 

역 직렬화 :

FileStream fs = new FileStream("file.xml", FileMode.Open); 
XmlReader xml = XmlReader.Create(fs); 

XmlSerializer ser = new XmlSerializer(typeof(List<Model>)); 

var list = (List<Model>)ser.Deserialize(xml); 

내가 잘못된 연산 예외를 얻을 실행 때 내가 지금까지 한 일이다 위의 코드. 내가 도대체 ​​뭘 잘못하고있는 겁니까? 당신이 IList<Animal>을 사용하고 있는지 제임스 포드

+0

당신은 당신의 클래스'Object' 이름을 안 그 모든의 기본 클래스입니다 수업. –

+0

@OskarKjellin 알다시피, 나는 ofc 프로젝트에서 그렇게 이름 지어지지 않았다. 나는 그 질문을 만들 때 명확하게 생각하고 있지 않았습니다. –

+0

@KirillPolishchuk 어떤면에서 형식이 잘못 되었나요? –

답변

3

문제가

감사합니다. 사용할 특정 유형을 알 수 있도록 List<Animal>을 사용해야합니다.

편집 : LINQPad에서 다음 코드를 사용하면 완벽하게 작동합니다. 유일한 차이점은 파일 대신 문자열을 통해 XML을로드하는 것입니다. 그러나 파일로 변경하더라도 잘 동작합니다. 방금 System.Xml.Serialization에 대한 사용을 추가했습니다.

void Main() 
{ 
    string xml = @"<?xml version=""1.0"" encoding=""utf-8""?> 
    <Animals> 
     <Animal> 
      <Name>Cow</Name> 
      <Color>Brown</Color> 
     </Animal> 
    </Animals>"; 

    XmlReader reader = XmlReader.Create(new StringReader(xml)); 

    XmlSerializer ser = new XmlSerializer(typeof(Model)); 

    var list = (Model)ser.Deserialize(reader); 
    list.Dump(); 
} 

// Define other methods and classes here 
[XmlRoot("Animals")] 
public class Model 
{ 
    [XmlElement("Animal")] 
    public List<Animal> AnimalList { get; set; } 
} 

public class Animal 
{ 
    [XmlElement("Name")] 
    public string Name{ get; set; } 
    [XmlElement("Color")] 
    public string Color{ get; set; } 
} 
3

난 당신이 당신의 XmlSerializer를 변경할 필요가 있다고 생각 : 당신이 모델로 XML 파일을 직렬화 할 당신이 모델의 목록을 직렬화하려고했던 전에

XmlSerializer ser = new XmlSerializer(typeof(Model));

하는 물건의 목록을 포함합니다.

는 또한, 당신이 시도

public List<Animal> AnimalList { get; set; }

4

에 통해 Objectlist 정의를 변경해야합니다

// Create a new XmlSerializer instance with the type of the test class 
XmlSerializer SerializerObj = new XmlSerializer(typeof(List<Model>)); 

// Create a new file stream for reading the XML file 
FileStream ReadFileStream = new FileStream(@"C:\file.xml", FileMode.Open, FileAccess.Read, FileShare.Read); 

// Load the object saved above by using the Deserialize function 
List<Model> LoadedObj = (List<Model>)SerializerObj.Deserialize(ReadFileStream); 

// Cleanup 
ReadFileStream.Close(); 
+0

같은 예외. –