1

내 XML 파일에서 목록을 역 직렬화하는 데 문제가 있습니다. 내 속성은 내부이므로 xmlserializer가 아닌 datacontractserializer를 사용하고 있습니다.DataContractSerializer 및 일반 목록

<?xml version="1.0" encoding="utf-8" ?> 
<Root xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/Root"> 
    <BackgroundColor> 
     0,0,255 
    </BackgroundColor> 
    <RowGap>1</RowGap> 
    <Table> 
     <TableHeading>"H1"</TableHeading> 
     <StartingColumn>A</StartingColumn> 
    </Table> 
    <Table> 
     <TableHeading>"H2"</TableHeading> 
     <StartingColumn>B</StartingColumn> 
    </Table>  
</Root> 

루트는 테이블의 목록을 가지고 다음과 같이

내 XML이다. ListOfTables는 deserialize되고 있지 않습니다. 클래스

[DataContract()] 
public class Root 
{ 
    [OnDeserialized] 
    internal void OnSerializingMethod(StreamingContext context) 
    { 
     if (Table == null) 
     { 
      Table = new List<TableStructure>(); 
     } 
    } 

    [DataMember(Name = "RowGap")] 
    internal int RowGap { get; set; } 

    [DataMember(Name = "TableHeaderBackgroundColor")] 
    internal string HdrBackColor { get; set; } 

    [DataMember()] 
    internal List<TableStructure> Table { get; set; } 
} 

[DataContract(Name = "Table", Namespace = "")] 
public sealed class TableStructure 
{ 
    [DataMember] 
    public string TableHeading { get; set; } 

    [DataMember] 
    public string StartingColumn { get; set; } 
} 

desrialize 방법

internal static Root GetSettings() 
{ 
    Root settings; 
    using (FileStream fs = new FileStream("Root.xml", FileMode.Open, FileAccess.Read)) 
    { 
      using (XmlDictionaryReader reader = XmlDictionaryReader.CreateTextReader(fs, new XmlDictionaryReaderQuotas())) 
      { 
       var x = new DataContractSerializer(typeof(Root)); 
       settings = (Root)x.ReadObject(reader); 
       reader.Close(); 
       fs.Close(); 
      } 
    } 
    return settings; 
} 

이 오류없이 실행하지만, 모든 테이블 정보를로드하지 않습니다. RowGap 및 색상로드 중

답변

3
나는 그것이 (도 추가 XML 네임 스페이스) 작업을 얻을 수 있도록 솔루션을 수정

:

[DataContract(Namespace = "http://schemas.datacontract.org/2004/07/Root")] 
public class Root 
{ 
    [OnDeserialized] 
    internal void OnSerializingMethod(StreamingContext context) 
    { 
     if (Table == null) 
     { 
      Table = new List<TableStructure>(); 
     } 
    } 

    [DataMember(Name = "RowGap")] 
    internal int RowGap { get; set; } 

    [DataMember(Name = "TableHeaderBackgroundColor")] 
    internal string HdrBackColor { get; set; } 

    [DataMember(Name = "Tables")] 
    internal List<TableStructure> Table { get; set; } 
} 

[DataContract(Name = "Table", Namespace = "http://schemas.datacontract.org/2004/07/Root")] 
public sealed class TableStructure 
{ 
    [DataMember(Name = "StartingColumn")] 
    public string TableHeading { get; set; } 

    [DataMember(Name = "TableHeading")] 
    public string StartingColumn { get; set; } 
} 

XML 파일을 :

<?xml version="1.0" encoding="utf-8" ?> 
<Root xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/Root"> 
    <BackgroundColor> 
    0,0,255 
    </BackgroundColor> 
    <RowGap>1</RowGap> 
    <!-- Used as container element for list --> 
    <Tables> 
    <Table> 
     <!-- Sorted elements alphabetically --> 
     <StartingColumn>A</StartingColumn> 
     <TableHeading>"H1"</TableHeading> 
    </Table> 
    <Table> 
     <!-- Sorted elements alphabetically --> 
     <StartingColumn>B</StartingColumn> 
     <TableHeading>"H2"</TableHeading> 
    </Table> 
    </Tables> 
</Root> 

참고 : T XML 요소의 순서는 여기에 언급 된 DataContractSerializer에 의해 고려됩니다. http://social.msdn.microsoft.com/Forums/vstudio/en-US/a891928b-d27a-4ef2-83b3-ee407c6b9187/order-of-data-members-in-the-xml-string-influences-deserialization-datacontractserializer?forum=wcf. 알파벳순으로 요소를 정렬하지 않았으므로 DataContractSerializer의 동작을 충족하도록 XML 파일을 수정했습니다.

DataMember 속성과 DataMember.Order 속성을 사용하여 XML 요소의 순서를 지정할 수 있습니다.

+0

당신의 도움에 감사드립니다. 이제 작동합니다. – MJK

1

xml을 어떻게 작성 했습니까? 손으로 또는 시리얼 라이저를 통해? 기존 <Table> 요소 (각각 TableStructure 인스턴스를 나타냄)를 둘러싼 <Table> 요소 (Root.Table 속성을 나타내는 요소)가 있어야합니다. 내 컴퓨터에서 예상대로

(DataContractSerializer에 의해 만들어진)이 XML은 역 직렬화 :

<Root xmlns="http://schemas.datacontract.org/2004/07/TestDataGrid" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
    <RowGap>101</RowGap> 
    <Table> 
     <Table xmlns=""> 
      <StartingColumn>1</StartingColumn> 
      <TableHeading>First</TableHeading> 
     </Table> 
     <Table xmlns=""> 
      <StartingColumn>2</StartingColumn> 
      <TableHeading>Second</TableHeading> 
     </Table> 
    </Table> 
    <TableHeaderBackgroundColor>c0ffee</TableHeaderBackgroundColor> 
</Root> 
+1

원본 테이블 요소에 xmlns 특성이 없습니다. 특성을 제거하고이를 deserialize하면 어떻게됩니까? –

+0

게시 한 xml에서 빈'xmlns' 속성을 제거하면'Table's가 deserialize되지 않습니다. deserializer에게 그 클래스가'Root'와는 다른 네임 스페이스에 있다는 것을 알리기 위해 어떻게 든 필요합니다. 그러나'Root' 클래스를 _same_ 네임 스페이스로 표시하면 ('[DataContract (Namespace = "")]'), xml의 xmlns 속성을 더 이상 얻을 수 없습니다. – Sphinxxx

+0

그러면 대답을 변경하여 언급해야합니다. –