2008-11-06 5 views
0

I가 I 클래스로 역 직렬화하고 싶은 다음 XML 내가 다음 클래스에 직렬화하려고이 간단한 xml 구성을 XmlSerializer 클래스로 deserialize하려면 어떻게해야합니까?

<?xml version="1.0" encoding="utf-8" ?> 
<root> 
    <element1>String1</element1> 
    <element2>String2</element2> 
</root> 

: 나는 다음과 같은 코드를 사용하여 직렬화를 해제하려고 할 때

[XmlRoot("root")] 
    public class root 
    { 
     [XmlElement("element1")] 
     internal string element1 { get; set; } 

     [XmlElement("element2")] 
     internal string element2 { get; set; } 
    } 

, config 객체가 초기화되지만 문자열은 null입니다.

 using (TextReader reader = new StreamReader(configFile)) 
     { 
      XmlSerializer serializer = new XmlSerializer(typeof(root)); 
      this.config = (root)serializer.Deserialize(reader); 
     } 

나는 그 기반으로 클래스를 XSD에를 만든 다음 만들 xsd.exe를 사용하여 시도했지만, 해당 도구에 의해 생성 된 너무 많은 혼란이있다. 나는 내가 여기 가까이 있다고 생각해. 내가 뭘 놓치고 있니?

답변

7

내부 속성을 직렬화/역 직렬화 할 수 없습니다. 공개 속성이어야합니다.

5

귀하의 문제의 성격과 관련하여 Brody와 동의합니다. 그러나이 필드를 공개하는 것에 이의가있을 수 있습니다. 과거에이 문제를 처리 한 방법은 .xml을 읽고 쓰는 것이 유일한 목적 인 직렬화 가능 클래스를 생성하고 모든 필드를 public으로 만드는 것입니다. 그런 다음 외부 인터페이스 인 새 클래스를 만듭니다. 직렬화 가능 클래스를 생성자의 인수로 사용하고 외부 클래스는 직렬화 가능 클래스에 대한 액세스를 제어하는 ​​public 속성을 제공합니다.

1

내 구현에 대한 후속 작업 ... 나는 XmlSerializer 클래스를 함께 사용하여 포기하게되었습니다. 비 직렬화하는 클래스는 매우 복잡하고 일련 화해야하는 다른 객체의 목록을 포함합니다. 클래스에 추가해야하는 속성의 양을 만들었습니다 code stink

XML을 Linq로 변환하여 직렬화를 수행했습니다 .... 클래스의 복잡성이 줄어들지 만 linq 문은 오히려 복잡한.

내가 다시해야한다면 WCF와 datacontract serializer를 사용하는 것에 대해 생각해봤을 것이다.

사람들이 최근 xml 문서를 개체로 deserialize하는 방법에 대해 궁금합니다. Linq 진술에 대해 머리를 쓰고 나면, 이것이 갈 길이라고 생각합니다. 개체는 훨씬 간단하게 만들 수 있으며 공개 될 필요가 없습니다. XmlSerializer는 "old-school"이고 XML에 대한 Linq는 "new-school"입니다.

다른 사람들의 의견을 듣고 싶습니다.

+0

XSD.exe를 사용해보세요. – Brody

1

XSD.exe를 사용하여 XSD (XML 스키마 정의)에서 클래스를 생성 할 수 있습니다. 이는 관련 XML을 직렬화 및 비 직렬화 할 수있는 사용 가능한 클래스 구조를 생성합니다.

관련 문제