C#/UWP

DataContractSerializer를 이용하여 xml deserializing 하기

Superkill 2018. 4. 19. 04:36
반응형

// Assemble the URL

string url = '<URL 입력>'

Uri uri = new Uri(url);


// Call out API

HttpClient http = new HttpClient();

var response = await http.GetAsync(uri);

string xml = await response.Content.ReadAsStringAsync();


// Response -> string / json -> deserialize

var serializer = new DataContractSerializer(typeof(Root));

var ms = new MemoryStream(Encoding.UTF8.GetBytes(xml));


var result = (Root)serializer.ReadObject(ms);

return result;




http 요청으로 받은 response의 xml  내용은 다음과 같다


이제 위의 xml을 serialize / deserialize 하기 위해
구조에 맞는 Data Contract을 작성해야 한다.
주의할 점은 다음과 같다.

1. 특히 deserialize 할 경우 XML에 명시 되어 있는 Namespace를 일치 시켜준다.
이번 경우는 명시되어있는 namespace가 없으므로 data contract에는
Namespace에 ""를 할당해준다.

Namespace를 지정해주지 않으면 다음과 같은 에러메세지가 뜬다.

encountered 'element' with name 'root' namespace ''

2. xml에서 노드의 자식이 여러 개일 때 alpabet 순서로 나열되어야 한다. 
만약 xml의 노드 순서를 바꿀 수 없다면 DataContract 상에서 order 속성으로 순서를 정해주어야 한다.

예를 들면 

paramData 노드의 자식 노드들은 알파벳 순서로 정렬되어 있지 않으므로DataContract 에서 order 속성으로 순서를 매겨주었다.


xml에서 root 노드의 자식인 paramData와 result는 알파벳 순서로 정렬되어 있지 않으므로 DataContract에서 order 속성으로 순서를 매겨줄 필요가 없다. 


그리고 Item 클래스에서는 번호를 매겨준 3가지 속성에만 값이 들어오고 나머지 속성에는 null 값이 들어온다.


3. 프로퍼티 위에 [DataMember] 표시를 해주지 않으면 그 값에는 null이 할당될 것이다.


4. xml에 있는 자식노드더라도 프로퍼티에 선언되어 있지 않으면
deserialize에 반영되지 않는다.



'C# > UWP' 카테고리의 다른 글

encountered 'element' with name 'root' namespace ''  (0) 2018.04.20
DataContractSerializer vs XmlSerializer  (0) 2018.04.18
뷰에 데이터 바인딩  (0) 2018.04.03
uwp ink  (0) 2018.03.26