2013-05-14 2 views
2

내가 만든 것처럼 느껴집니다. 백 개의 비 직렬화 루틴을 작성했지만,이 하나가 나를 죽이고있다!C에서 xmlSerializer를 사용하여 매우 간단한 xml을 비 직렬화 할 수 없습니다. #

다음은 서비스에서 반환 한 것입니다. 문자열의 아주 간단한 배열 ... 나는 생각한다. 내가 역 직렬화 상자를 사용하고

<ArrayOfstring xmlns="http://schemas.microsoft.com/2003/10/Serialization/Arrays" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
    <string>Action &amp; Adventure</string> 
    <string>Comedy</string> 
    <string>Drama</string> 
    <string>Family</string> 
    <string>Horror</string> 
    <string>Independent &amp; World</string> 
    <string>Romance</string> 
    <string>Sci-Fi/Fantasy</string> 
    <string>Thriller &amp; Crime</string> 
</ArrayOfstring> 

var serializer = new XmlSerializer(typeof(List<string>)); 
var reader = new StringReader(xmlString); 
var GenreList = (List<string>)serializer.Deserialize(reader); 

하지만 난 역 직렬화 줄에 다음 오류가 얻을 :

<ArrayOfstring xmlns='http://schemas.microsoft.com/2003/10/Serialization/Arrays'> was not expected 

나는 네임 스페이스를 포함하고 모든 방법을 만드는 시도 이국적인 물건을 작동 시키려고 시도했다. 미친 시간. 결국 나는 JSON에서 요청하고 그것을 Json.net과 deserialised했다.

그러나 내가 잘못한 것을 궁금해합니다!

답변

4

시리얼이하는 SimpleType 또는 추가 사양없이 단순 유형의 목록을 역 직렬화 할 수 없습니다 XML,하지만 DataContractReader을 수행 할 수 있습니다

 string content = @" 
     <ArrayOfstring xmlns=""http://schemas.microsoft.com/2003/10/Serialization/Arrays"" xmlns:i=""http://www.w3.org/2001/XMLSchema-instance""> 
      <string>Action &amp; Adventure</string> 
      <string>Comedy</string> 
      <string>Drama</string> 
      <string>Family</string> 
      <string>Horror</string> 
      <string>Independent &amp; World</string> 
      <string>Romance</string> 
      <string>Sci-Fi/Fantasy</string> 
      <string>Thriller &amp; Crime</string> 
     </ArrayOfstring>"; 

     var serializer = new DataContractSerializer(typeof(string[])); 
     var reader = new XmlTextReader(new StringReader(content)); 
     var GenreList = new List<string>((string[])serializer.ReadObject(reader)); 
+0

-1 '은 XML은 시리얼이하는 SimpleType 또는 단순 types'의 목록 나는 그렇게 확신 말할 것을 역 직렬화 할 수없는 작동하는 XmlSerializer를 만드는 것입니다. (BTW : 내 downvote는 미래의 독자에 관한 허위 진술만을 위해, 당신이 그것을 제거하고 DataContractReader 만 설명하면 내 downvote를 취소 할 것입니다) – I4V

+0

성명을 업데이트했습니다. 루트 요소를 추가하지 않고 네임 스페이스 또는 다른 '트릭'을 지정하지 않으면 그렇지 않습니다. – jessehouwing

+0

어디에서 DataContractSerializer를 찾을 수 있습니까? – ecoe

0

또한 동일한 결과를 달성하기 위해 간단한 클래스를 사용할 수 있습니다. 간결함을 위해 XML 파일에서 네임 스페이스를 제거했습니다. 원할 경우 serializer에서 네임 스페이스 읽기를 구현할 수 있습니다.

public class ArrayOfstring 
    { 
     [XmlElement("string")] 
     public List<string> strings; 
    } 

    private void Deserialize(string xmlString) 
    { 
     var serializer = new XmlSerializer(typeof(ArrayOfstring)); 
     var reader = new StringReader(xmlString); 
     var GenreList = ((ArrayOfstring) serializer.Deserialize(reader)).strings; 
    } 
+0

나는 이것을 시도했지만 여전히 실패했다. [XmlRoot] 공용 클래스 ArrayOfstring { [XmlElement ("string")] public string [] Strings {get; 세트; } } – NER1808

3

물론 XmlSerializer는이를 deserialize 할 수 있습니다. 당신이 필요로

var serializer = new XmlSerializer(typeof(List<string>), 
            new XmlRootAttribute() { ElementName = "ArrayOfstring", Namespace = "http://schemas.microsoft.com/2003/10/Serialization/Arrays" }); 
0

을 다음과 같이이

DataContractSerializer xmlSer = new DataContractSerializer(typeof(string[])); 
TextReader reader=new StreamReader(xmlString); 
var stringArr= (string[])xmlSer.ReadObject(reader); 
List<string> listStr=new List<>(); 
for(var s in stringArr) 
{ 
listStr.Add(s); 
}