2014-01-21 4 views
1

클래스가 있습니다. 이 클래스에 XML 파일을 deserialize하고 싶습니다.XML 비 직렬화 배열

<Pmsp_Update> 
    <OldVersion>v4.0.0</OldVersion> 
    <NewVersion>v4.0.1</NewVersion> 
    <Applications> 
    <Application> 
     <AppName>SampleApp</AppName> 
     <UpdateDetail>sample</UpdateDetail> 
    </Application> 
    </Applications> 
</Pmsp_Update> 

내가 속성에 대해 물어보고 싶은 : 여기

public partial class Form1 : Form 
{ 
    public string xmlFile; 

    public Form1() 
    { 
     InitializeComponent(); 
     xmlFile = "Sample.xml"; 
    } 

    [Serializable] 
    public class Application 
    { 
     public string AppName; 
     public string UpdateDetail; 
    }; 

    [Serializable] 
    public class Applications 
    { 
     [XmlElement] 
     public Application[] Application; 
    }; 



    [Serializable] 
    public class Pmsp_Update 
    { 
     public string OldVersion; 
     public string NewVersion; 
     public Applications Applications; 
    }; 

    private void btnRead_Click(object sender, EventArgs e) 
    { 
     XmlReader reader = XmlReader.Create(xmlFile); 
     XmlSerializer ser = new XmlSerializer(typeof(Pmsp_Update)); 
     Pmsp_Update pu; 
     using (reader = XmlReader.Create(xmlFile)) 
     { 
      pu = (Pmsp_Update)ser.Deserialize(reader); 
     } 
    } 
} 

그리고

은 XML이다. 나는 [Serializable] 속성 만 사용했고 클래스를 얻을 수 있습니다. 나는 [XmlElement] 속성을 사용하지 않았으며 하나만 제외하고 어떤 오류도 발생시키지 않았습니다.

I는 다음과 같이 사용하는 경우 나 배열을 채울 수 있지만 :이 같이 사용하는 경우

 [Serializable] 
     public class Applications 
     { 
      [XmlElement] 
      public Application[] Application; 
     }; 

내가 배열을 채울 수 없습니다

[Serializable] 
public class Applications 
{ 
    public Application[] Application; 
}; 

그래서, 내 질문은 이것이다 : 필드에 [XmlElement]을 사용하지 않고 모든 것이 잘 작동하지만 배열을 채울 수 없습니다. 필드를 채울 수는 있지만 [XmlElement]을 사용하지 않으면 왜 배열을 채울 수 없습니까?

+1

'[Serializable]'은'XmlSerializer'와 아무 관련이 없습니다. 이진 직렬화가 가능합니다. –

+0

[Serializable]을 사용하지 않으면 어떻게 클래스를 직렬화 할 수 있습니까? 그리고 내 질문은 [Serializable]에 관한 것이 아닙니다. 하지만, 고마워요 –

+1

XML 직렬화를위한 * enable *이 없습니다. 그것은 * 작동합니다. 다양한 * [Xml ...] * 속성은 세부 사항을 추가로 제어하기위한 것입니다. –

답변

2

무슨 일이 일어나는지 확인하는 가장 쉬운 방법은 클래스의 객체를 만들고 XML로 직렬화하는 것입니다. 이것은 내가 무엇을 얻을 :

[XmlElement]

<?xml version="1.0" encoding="utf-16"?> 
<Pmsp_Update xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <OldVersion>v4.0.0</OldVersion> 
    <NewVersion>v.4.0.1</NewVersion> 
    <Applications> 
    <Application> 
     <AppName>Test</AppName> 
     <UpdateDetail>test</UpdateDetail> 
    </Application> 
    </Applications> 
</Pmsp_Update> 

당신이 볼 수 있듯이, 오직 두 번째는 사용자의 입력 XML 일치와

<?xml version="1.0" encoding="utf-16"?> <Pmsp_Update xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <OldVersion>v4.0.0</OldVersion> <NewVersion>v.4.0.1</NewVersion> <Applications> <Application> <Application> <AppName>Test</AppName> <UpdateDetail>test</UpdateDetail> </Application> </Application> </Applications> </Pmsp_Update> 

[XmlElement]없이, 그래서 XML을 사용하지 않고 XML을 deserialize 할 수 없습니다. [XmlElement] 속성 - XML 문서가 클래스 구조과 일치하지 않기 때문입니다.

비어있는 배열 속성의 XmlElement은 serializer가 추가 요소가 배열 요소를 처리하지 못하게합니다. 그 동작은 MSDN에 설명되어 있습니다 : XmlElementAttribute Class

당신이 배열을 반환하는 필드 또는 속성에 XmlElementAttribute이 배열의 항목이 XML 요소의 시퀀스로 인코딩됩니다 적용합니다. 이에

XmlElementAttribute 은 이러한 필드 또는 속성에인가되지 않는 경우는, 상기 어레이의 항목은 필드 또는 속성 따서 요소 아래에 중첩 요소 시퀀스로 인코딩된다. 배열을 직렬화하는 방법을 제어하려면 XmlArrayAttributeXmlArrayItemAttribute 특성을 사용하십시오.당신이 Applications 클래스를 필요가 없습니다)

당신은 당신의 계급 구조를 변경하여 동일한 달성 할 수

public class Application 
{ 
    public string AppName; 
    public string UpdateDetail; 
}; 

public class Pmsp_Update 
{ 
    public string OldVersion; 
    public string NewVersion; 
    public Application[] Applications; 
}; 

<Applications>

에 요소는 배열 속성에 자동으로 추가됩니다.