업데이트 : 처리됨 - 아래를 참조하십시오!다른 요소에있는 동일한 유형의 자식으로 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; }
대체함으로써 문제를 해결했다.
질문에 대한 답변으로 솔루션을 게시 한 다음 수락 할 수 있습니다. 이것은이 질문에 대한 답이 우리에게 더 분명하게 드러납니다. –
안녕하세요. Thomas W. 솔루션을 추가했습니다. 어떤 이유로 SO는 자신의 답변을 게시하기 전에 적어도 하루 전의 질문을 요구합니다. –