2011-09-26 5 views
6

나는 다음 XML이 있습니다직렬화 된 XML 다른 요소는

<table-display-fields> 
    <field name="NAME/> 
    <field name="DESCRIPTION" /> 
</table-display-fields> 

나는 다음 코드 것을 deserealize :

[XmlArray("table-display-fields")] 
[XmlArrayItem("field")] 
public TableDisplayField[] TableDisplayFields; 

가 그럼 난 테이블 디스플레이 분야에 새로운 XML 요소를 추가 노드 :

<table-display-fields> 
    <record-number-field name="ID" /> 
    <field name="NAME/> 
    <field name="DESCRIPTION" /> 
</table-display-fields> 

그런 다음 기록 번호 필드를 deserealize하기 위해 다음 코드를 추가합니다

[XmlArray("table-display-fields")] 
[XmlArrayItem("record-number-field")] 
public TableDisplayField[] RecordTableDisplayFields; 

[XmlArray("table-display-fields")] 
[XmlArrayItem("field")] 
public TableDisplayField[] TableDisplayFields; 

이것은 작동하지 않습니다. 새 XML을 deserealize하고 기존 속성 경로를 저장하려면 어떻게합니까?

+0

이것은 작동하지 않습니까? 정확히 어떻게됩니까? –

+0

다음 예외가 있습니다 : System.Web.HttpUnhandledException (0x80004005) : 'System.Web.HttpUnhandledException'형식의 예외가 발생했습니다. ---> System.InvalidOperationException : 'TableDisplayConfiguration'형식을 반영하는 오류가 발생했습니다. System.InvalidOperationException ---> : 'TableDisplayFields'필드를 반영하는 오류가 발생했습니다. ---> System.InvalidOperationException : 네임 스페이스 'http : // localhost/configuration/application'의 XML 요소 'table-display-fields'가 이미 현재 범위에 있습니다. XML 속성을 사용하여 요소의 다른 XML 이름 또는 네임 스페이스를 지정하십시오. – tbicr

답변

1

XmlArrayItem() 특성을 제거해야합니다.

[XmlArray("table-display-fields")] 
public object[] TableDisplayItems; 

TableDisplayItems 각 오브젝트 중 어느 하나 또는 fieldrecord-number-field 것이다.

물론 배열 하나 위에 단 하나의 record-number-field 만 있다면 해결책이 훨씬 더 좋을 수 있습니다. 그럴까요?

+0

예. 별도의 레코드 번호 필드와 필드 요소가 필요합니다. – tbicr

0

귀하의 요구 사항에 대한보다 정교한 설명과 귀하의 접근 방향을 제공 할 수 있다면 도움이 될 것입니다.

using System.Collections.Generic; 
using System.Xml.Serialization; 

namespace Serialization01 { 
    [XmlRoot("table-display-fields")] 
    public class TableDisplayFields { 
     [XmlElement("record-number-field")] 
     public string RecordNumberField { get; set; } 

     [XmlElement("field")] 
     public List<string> FieldName { get; set; } 

     public TableDisplayFields () { 
      FieldName = new List<string>(5); 
     } 
    } 
} 

와 쓰기를 위해 아래의 코드를 사용하여 직렬화 된 데이터를 읽고 : : 도움이

using System.IO; 
using System.Xml.Serialization; 
using System; 

namespace Serialization01 { 
    class Program { 
     static void Main (string [] args) { 
      // Initiate the class 
      TableDisplayFields t = new TableDisplayFields(); 

      t.RecordNumberField = "ID"; 
      t.FieldName.Add("NAME"); 
      t.FieldName.Add("DESCRIPTION"); 

      TextWriter tw = new StreamWriter(Path.Combine(Environment.CurrentDirectory, "Data.xml")); 

      XmlSerializer xs = new XmlSerializer(t.GetType()); 

      xs.Serialize(tw, t); 

      tw.Flush(); 
      tw.Close(); 

      TextReader tr = new StreamReader(Path.Combine(Environment.CurrentDirectory, "Data.xml")); 
      TableDisplayFields t2 = xs.Deserialize(tr) as TableDisplayFields; 

      Console.WriteLine("RecordNumberField for t2 is {0}", t2.RecordNumberField); 
      foreach (string field in t2.FieldName) { 
       Console.WriteLine("Found field '{0}'", field); 
      } 
     } 
    } 
} 

희망을 정상적인 직렬화는/역 직렬화는 당신이 아래의 솔루션을 시도 할 수 있습니다 찾고있는 경우.

+0

고마워요,하지만 이건 정말보고 싶지 않아요. 이것은 간단한 해결책이지만 기존 코드의 리팩토링이 필요합니다. – tbicr