我有一段XML需要序列化/反序列化,但是我很难让它完全按照需要工作。我已经为98%的结构工作了代码,但是我无法在根节点上获取序列化/反序列化的属性。
示例XML;
<rootNode date="2000-01-01" time="07:00">
<detail>
<reference>12345</reference>
</detail>
</rootNode>
目前用于反序列化的类;
[XmlType("detail")]
public class Detail
{
[XmlElement("reference")]
public string Reference { get; set; }
}
[XmlRoot("rootNode")]
public class Root : List<Detail>
{
[XmlAttribute("date")]
public string Date { get; set; }
[XmlAttribute("time")]
public string Time { get; set; }
}
从实际XML重命名的每个元素的细节在我的实现中是重要且必要的。如果我不从List<Detail>
继承并拥有一个集合属性(假设Details
具有相同类型),那么我可以获取属性,但最终会使用XML;
<rootNode date="2000-01-01" time="07:00">
<Details>
<detail>
<reference>12345</reference>
</detail>
</Details>
</rootNode>
但这并不是我试图反序列化的原因。控制它通过XmlArray
和XmlArrayItem
序列化的方式允许我重命名集合节点和项目节点,但不能摆脱集合节点本身。有什么建议吗?
答案 0 :(得分:2)
我认为您应该从Root移除继承到List,并将Details属性添加到Root:
[XmlType("detail")]
public class Detail
{
[XmlElement("reference")]
public string Reference { get; set; }
}
[XmlRoot("rootNode")]
public class Root
{
[XmlAttribute("date")]
public string Date { get; set; }
[XmlAttribute("time")]
public string Time { get; set; }
[XmlElement("detail")]
List<Detail> Details { get; set; }
}
答案 1 :(得分:1)
[XmlType("detail")]
public class Detail
{
[XmlElement("reference")]
public string Reference { get; set; }}
}
[XmlRoot("rootNode")]
public class Root
{
[XmlAttribute("date")]
public string Date { get; set; }
[XmlAttribute("time")]
public string Time { get; set; }
[XmlElement("detail")]
public Detail detail{ get; set; }
}
或者您使用IXmlSerializable进行“自定义”序列化 Override XML Serialization Method
答案 2 :(得分:1)
这只是@Oscar在答案中提及的另一个背景。
经常:favor composition over inheritance。基本上,您应该问自己,Root
- 元素 是Detail
的列表,还是 的列表。如有疑问,请考虑以下事项:
您的Root
- 元素应该是具有某些属性的实例。它还 其中的元素列表Details
。如果您在覆盖列表之后,基本上说Root
是一个列表,但是我想覆盖该列表的方式后面工作(例如你想修改Add
- 方法做一些不同的事情)。但是在你的情况下你要做的只是扩展列表而不是覆盖它,不是吗?