Xml 序列化列表中的根属性 class
Xml Serialize root attribute on List class
我有一块 XML 需要 serialize/deserialize 但我很难让它完全按照需要工作。我的代码适用于 98% 的结构,但我无法在根节点上获取属性 serialized/deserialized。
样本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
控制它的序列化方式允许我重命名集合节点和项目节点,但不能删除集合节点本身。有什么建议吗?
我认为你应该删除从 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; }
}
[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; }
}
或者您使用 "customized" 序列化和 IXmlSerializable
Override XML Serialization Method
这只是@Oscar 在他的回答中提到的额外背景。
经常:favor composition over inheritance。基本上你应该问自己 Root
元素 是 的列表 Detail
,还是 有 一个.如有疑问,请考虑以下事项:
您的 Root
-元素应该是具有某些属性的实例。它还 有一个 元素列表,即 Details
。如果你在 覆盖 列表之后,你基本上说 Root
是 一个列表,但是我想 override 该列表背后的工作原理(例如,您想修改 Add
方法来做一些不同的事情)。但是,在您的情况下,您要做的就是 扩展 列表而不是 覆盖 列表,不是吗?
我有一块 XML 需要 serialize/deserialize 但我很难让它完全按照需要工作。我的代码适用于 98% 的结构,但我无法在根节点上获取属性 serialized/deserialized。
样本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
控制它的序列化方式允许我重命名集合节点和项目节点,但不能删除集合节点本身。有什么建议吗?
我认为你应该删除从 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; }
}
[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; }
}
或者您使用 "customized" 序列化和 IXmlSerializable Override XML Serialization Method
这只是@Oscar 在他的回答中提到的额外背景。
经常:favor composition over inheritance。基本上你应该问自己 Root
元素 是 的列表 Detail
,还是 有 一个.如有疑问,请考虑以下事项:
您的 Root
-元素应该是具有某些属性的实例。它还 有一个 元素列表,即 Details
。如果你在 覆盖 列表之后,你基本上说 Root
是 一个列表,但是我想 override 该列表背后的工作原理(例如,您想修改 Add
方法来做一些不同的事情)。但是,在您的情况下,您要做的就是 扩展 列表而不是 覆盖 列表,不是吗?