2

C#을 사용하여 SILVERLIGHT에서 직렬화를 시도하고 있습니다. 전에는 XmlArray를 사용하고 있었지만 작동 중이 었습니다. 대신 List를 사용하고 싶습니다. List를 사용하여 이전 파트를 모두 수행 했으므로 (배열을 사용할 때 이상하게 보입니다).List (배열 아님)를 사용하여이 xml을 deserialize하는 방법

내 XML은 같다 :

<ps> 
    <disable_others> 
     <disable_other> 
      <disable_value>1</disable_value> 
      <to_disable>skew</to_disable> 
      <to_disable>skew_side</to_disable> 
     </disable_other> 
     <disable_other> 
      <disable_value>0</disable_value> 
      <to_disable>automodel</to_disable> 
     </disable_other> 
    </disable_others> 
<ps> 

그리고 내 시도는이 역 직렬화 :

[XmlRoot(ElementName = "ps")] 
    public class ps 
    { 
     [XmlArray("disable_others")] 
     [XmlArrayItem("disable_other", IsNullable = false)] 
     public List<string> Disable_Others { get; set; } 

     /* I know it can be done using the below but i have to use List not array: 
       [XmlArray("disable_others")] 
     [XmlArrayItem("disable_other", IsNullable = false)] 
     public Disable_Other[] Disable_Others { get; set; } */ 



    } 


[XmlRoot(ElementName = "disable_Others")] 
    public class Disable_Others 
    { 
     [XmlElement("disable_other")] 
     public List<Disable_Other> Disable_Other { get; set; } 

    } 

[XmlRoot(ElementName = "Disable_Other")] 
    public class Disable_Other 
    { 
     [XmlElement("disablingitem")] 
     public int DisablingItem { get; set; } 

     [XmlElement("to_disable")] 
     public string[] To_Disable { get; set; } 

     [XmlElement("disable_value")] 
     public byte Disable_Value { get; set; } 

    } 

은 어떤 사람이 나를 대신 배열 (XmlArray) 목록을 사용하여 목표를 달성하는 데 도움이 시겠어요?

+0

배열에 대한 작업을 이미 수행 한 경우에는 ['Enumerable.ToList()'] (http://msdn.microsoft.com)을 사용할 수 없습니다. /en-us/library/vstudio/bb342261%28v=vs.100%29.aspx) 배열에? (또는 너무 비효율적입니까?) –

+0

@MatthewWatson 아니요, 수동으로해야합니다. – Sss

+0

u는 목록 필드와 함께 xmlarray ...를 사용할 수 있습니다. 클래스를 [serializable]로 표시해야합니다. – terrybozzio

답변

2

귀하의 XML은 다음과 같이 포맷해야합니다 :

ps p; 
XmlSerializer serializer = new XmlSerializer(typeof(ps)); 
using (StreamReader reader = new StreamReader("test1.xml")) 
{ 
    //basic exception handling... 
    try 
    { 
     p = (ps)serializer.Deserialize(reader); 
    } 
    catch (Exception ex) 
    { 
     Console.WriteLine(ex.Message); 
    } 
} 
이 같은 역 직렬화하는

[Serializable] 
    [XmlRoot(ElementName = "ps")] 
    public class ps 
    { 
     [XmlArray("disable_others")] 
     [XmlArrayItem(typeof(Disable_Other), IsNullable = false)] 
     public List<Disable_Other> Disable_Others { get; set; } 

     public ps() 
     { 
      Disable_Others = new List<Disable_Other>(); 
     } 

    } 

    [Serializable] 
    [XmlRoot("disable_other")] 
    public class Disable_Other 
    { 
     [XmlElement("disablingitem")] 
     public int DisablingItem { get; set; } 

     //[XmlElement("to_disable")] 
     [XmlArray("to_disable")] 
     public string[] To_Disable { get; set; } 

     [XmlElement("disable_value")] 
     public byte Disable_Value { get; set; } 

    } 

그리고 코드에서 다음해야이 수업 후

<?xml version="1.0"?> 
<ps xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <disable_others> 
    <Disable_Other> 
     <disablingitem>0</disablingitem> 
     <to_disable> 
     <string>skew</string> 
     <string>skew_side</string> 
     </to_disable> 
     <disable_value>1</disable_value> 
    </Disable_Other> 
    <Disable_Other> 
     <disablingitem>0</disablingitem> 
     <to_disable> 
     <string>automodel</string> 
     </to_disable> 
     <disable_value>0</disable_value> 
    </Disable_Other> 
    </disable_others> 
</ps> 

+0

죄송합니다. "skew"및 "skew_side"에 액세스 할 수 없습니다. 그리고 왜 내가 Disable_Other [index] 안의 데이터에 접근하기 위해 배열을 가질 필요가 있습니까? 나는 "object1.Disable_Others [0] .To_Disable"을 실행하려고 노력하고 있습니다. ans는 0을 표시하고 내부의 모든 값은 null입니다. – Sss

+0

그리고 [Serializable]을 사용하지 않고 사용하기 전에 ([Serializable]이 없어도)이 공용 Disable_Other [] Disable_Others {get; set;}처럼 작동 할 때 [Serializable]을 사용해야합니다. – Sss

+0

당신의 XML 포맷 방법은 2 to_disable 값이며 To_Disable 코드는 배열이고 xml은 내 예제와 같아야합니다. XML 파일을 만들고 예제 XML을 붙여 넣기하십시오. 2 클래스 내가했던 것처럼 귀하의 전화 코드에서 내 deserializing 예를 들어 당신은 모든 일을 볼 수 있습니다 ... – terrybozzio