2013-06-13 2 views
3

업데이트 : 처리됨 - 아래를 참조하십시오!다른 요소에있는 동일한 유형의 자식으로 XML 비 직렬화

네트워크 노드가 포함 된 XML 파일을 비 직렬화 할 때 자식 요소를 처리 할 때 문제가있는 것으로 보입니다.

나는 다음 부모 (루트) 클래스있어 : 하위 클래스로 NetworkCollection

[Serializable, XmlRoot("networks"), XmlType("networks")] 
public class NetworkCollection : CollectionBase, IBindingList 
{ 
    // ... 
} 

을 : 같은

[Serializable, XmlRoot("network"), XmlType("network")] 
public class Network 
{ 
    [XmlAttribute("id")] 
    public string Id { get; set; } 

    [XmlElement("name")] 
    public string Name { get; set; } 

    // ... 

    [XmlElement("nodes")] 
    public NodeCollection Nodes { get; set; } 

    [XmlElement("to_add")] 
    public NodeCollection NodesToAdd { get; set; } 

    [XmlElement("to_remove")] 
    public NodeCollection NodesToRemove { get; set; } 

    [XmlElement("available")] 
    public NodeCollection NodesAvailable { get; set; } 
} 

네트워크

[Serializable, XmlRoot("nodes"), XmlType("nodes")] 
public class NodeCollection : CollectionBase, IBindingList 
{ 
    // ... 
} 

[Serializable, XmlRoot("node"), XmlType("node")] 
public class Node 
{ 
    [XmlAttribute("id")] 
    public string Id { get; set; } 

    [XmlElement("mac_address")] 
    public string MacAddress { get; set; } 
} 

NodeCollection 및 노드에 대한 다음과 같이 다른 노드 유형입니다.

,210
[Serializable, XmlRoot("node_type_a"), XmlType("node_type_a")] 
public class NodeTypeA : Node 
{ 
    // ... 
} 

[Serializable, XmlRoot("node_type_b"), XmlType("node_type_b")] 
public class NodeTypeB : Node 
{ 
    // ... 
} 

[Serializable, XmlRoot("node_type_c"), XmlType("node_type_c")] 
public class NodeTypeC : Node 
{ 
    // ... 
} 

는 XML은 무엇 발생하면이 null로 설정 속성 (MAC 주소)를의 모든 하나의 노드 객체를 포함하고 있으므로, 모든 NodeCollection 하나 개의 요소가 포함되어

Nodes (1), 
NodesToAdd (1), 
NodesToRemove (1) and 
NodesAvailable (1) 

인이

<?xml version="1.0" encoding="ISO-8859-1"?> 
<networks> 
    <network id="bcb468cac8a34052bf5a5bad8f22d0d7"> 
    <name>Network Name</name> 
    <nodes> 
     <node_type_a id="0ac4774277a941228b27d8cfd7ef202e"> 
     <mac_address>AABBCCDDEEFF</mac_address> 
     </node_type_b> 
     <node_type_a id="4ca5abb4bb8742c3b321250c20592542"> 
     <mac_address>BBCCDDEEFFAA</mac_address> 
     </node_type_a> 
     <node_type_b id="bde044c9aa1948978ba1bc980f00c36b"> 
     <mac_address>CCDDEEFFAABB</mac_address> 
     </node_type_b> 
     <node_type_c id="d3f2cb7bd92e4dc89930eeb3cdaeb680"> 
     <mac_address>DDEEFFAABBCC</mac_address> 
     </node_type_c> 
     <node_type_c id="039d140b5cc54e06b915b91fb5d8acdf"> 
     <mac_address>EEFFAABBCCDD</mac_address> 
     </node_type_c> 
    </nodes> 
    <to_add/> 
    <to_remove/> 
    <available> 
     <node> 
     <mac_address>FFAABBCCDDEE</mac_address> 
     </node> 
     <node> 
     <mac_address>001122334455</mac_address> 
     </node> 
     <node> 
     <mac_address>112233445566</mac_address> 
     </node> 
     <node> 
     <mac_address>223344556677</mac_address> 
     </node> 
    </available> 
    </network> 
</networks> 

처럼 보인다 ;

Nodes (5), 
NodesToAdd (0), 
NodesToRemove (0) and 
NodesAvailable (4) 

NetworkCollection를 직렬화 복원해야하며, 네트워크가 잘 작동합니다. NodeCollection 속성에 관한 것입니다.

XmlRoot 및 XmlType 특성에 유의하십시오. 사용 가능한 노드의 "Id"는 null/missing 일 수 있습니다.

어떻게 처리해야합니까? 안부


OK, 제가

[XmlArray("nodes")] 
[XmlArrayItem(ElementName = "node", Type = typeof(Node))] 
[XmlArrayItem(ElementName = "node_type_a", Type = typeof(NodeTypeA))] 
[XmlArrayItem(ElementName = "node_type_b", Type = typeof(NodeTypeB))] 
[XmlArrayItem(ElementName = "node_type_c", Type = typeof(NodeTypeC))] 
public NodeCollection Nodes { get; set; } 

[XmlArray("to_add")] 
[XmlArrayItem(ElementName = "node", Type = typeof(Node))] 
[XmlArrayItem(ElementName = "node_type_a", Type = typeof(NodeTypeA))] 
[XmlArrayItem(ElementName = "node_type_b", Type = typeof(NodeTypeB))] 
[XmlArrayItem(ElementName = "node_type_c", Type = typeof(NodeTypeC))] 
public NodeCollection NodesToAdd { get; set; } 

[XmlArray("to_remove")] 
[XmlArrayItem(ElementName = "node", Type = typeof(Node))] 
[XmlArrayItem(ElementName = "node_type_a", Type = typeof(NodeTypeA))] 
[XmlArrayItem(ElementName = "node_type_b", Type = typeof(NodeTypeB))] 
[XmlArrayItem(ElementName = "node_type_c", Type = typeof(NodeTypeC))] 
public NodeCollection NodesToRemove { get; set; } 

[XmlArray("available")] 
[XmlArrayItem(ElementName = "node", Type = typeof(Node))] 
[XmlArrayItem(ElementName = "node_type_a", Type = typeof(NodeTypeA))] 
[XmlArrayItem(ElementName = "node_type_b", Type = typeof(NodeTypeB))] 
[XmlArrayItem(ElementName = "node_type_c", Type = typeof(NodeTypeC))] 
public NodeCollection NodesAvailable { get; set; } 

관해서

[XmlElement("nodes")] 
public NodeCollection Nodes { get; set; } 

[XmlElement("to_add")] 
public NodeCollection NodesToAdd { get; set; } 

[XmlElement("to_remove")] 
public NodeCollection NodesToRemove { get; set; } 

[XmlElement("available")] 
public NodeCollection NodesAvailable { get; set; } 

대체함으로써 문제를 해결했다.

+0

질문에 대한 답변으로 솔루션을 게시 한 다음 수락 할 수 있습니다. 이것은이 질문에 대한 답이 우리에게 더 분명하게 드러납니다. –

+1

안녕하세요. Thomas W. 솔루션을 추가했습니다. 어떤 이유로 SO는 자신의 답변을 게시하기 전에 적어도 하루 전의 질문을 요구합니다. –

답변

2

OK, 제가

[XmlArray("nodes")] 
[XmlArrayItem(ElementName = "node", Type = typeof(Node))] 
[XmlArrayItem(ElementName = "node_type_a", Type = typeof(NodeTypeA))] 
[XmlArrayItem(ElementName = "node_type_b", Type = typeof(NodeTypeB))] 
[XmlArrayItem(ElementName = "node_type_c", Type = typeof(NodeTypeC))] 
public NodeCollection Nodes { get; set; } 

[XmlArray("to_add")] 
[XmlArrayItem(ElementName = "node", Type = typeof(Node))] 
[XmlArrayItem(ElementName = "node_type_a", Type = typeof(NodeTypeA))] 
[XmlArrayItem(ElementName = "node_type_b", Type = typeof(NodeTypeB))] 
[XmlArrayItem(ElementName = "node_type_c", Type = typeof(NodeTypeC))] 
public NodeCollection NodesToAdd { get; set; } 

[XmlArray("to_remove")] 
[XmlArrayItem(ElementName = "node", Type = typeof(Node))] 
[XmlArrayItem(ElementName = "node_type_a", Type = typeof(NodeTypeA))] 
[XmlArrayItem(ElementName = "node_type_b", Type = typeof(NodeTypeB))] 
[XmlArrayItem(ElementName = "node_type_c", Type = typeof(NodeTypeC))] 
public NodeCollection NodesToRemove { get; set; } 

[XmlArray("available")] 
[XmlArrayItem(ElementName = "node", Type = typeof(Node))] 
[XmlArrayItem(ElementName = "node_type_a", Type = typeof(NodeTypeA))] 
[XmlArrayItem(ElementName = "node_type_b", Type = typeof(NodeTypeB))] 
[XmlArrayItem(ElementName = "node_type_c", Type = typeof(NodeTypeC))] 
public NodeCollection NodesAvailable { get; set; } 

관해서

[XmlElement("nodes")] 
public NodeCollection Nodes { get; set; } 

[XmlElement("to_add")] 
public NodeCollection NodesToAdd { get; set; } 

[XmlElement("to_remove")] 
public NodeCollection NodesToRemove { get; set; } 

[XmlElement("available")] 
public NodeCollection NodesAvailable { get; set; } 

대체함으로써 문제를 해결했다.