【发布时间】:2016-04-20 13:19:27
【问题描述】:
我正在尝试序列化下面显示的 Outer 类,并从序列化的 XML 创建一个 XElement。它有一个Inner 类型的属性。我想将Inner(更改为Inner_X)和Outer(更改为Outer_X)的名称都更改。
class Program
{
static void Main(string[] args)
{
using (MemoryStream memoryStream = new MemoryStream())
{
using (TextWriter streamWriter = new StreamWriter(memoryStream))
{
var xmlSerializer = new XmlSerializer(typeof(Outer));
xmlSerializer.Serialize(streamWriter, new Outer());
XElement result = XElement.Parse(Encoding.ASCII.GetString(memoryStream.ToArray()));
}
}
}
}
[XmlType("Outer_X")]
public class Outer
{
public Outer()
{
this.InnerItem = new Inner();
}
public Inner InnerItem { get; set; }
}
[XmlType("Inner_X")]
public class Inner
{
}
这会创建一个XElement,如下所示:
<Outer_X xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<InnerItem />
</Outer_X>
我想要的是:
<Outer_X xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Inner_X />
</Outer_X>
我想保留有关如何使用该类重命名类的信息。我想我可以使用XmlType 属性来做到这一点。但是,这会被忽略,而是使用属性名称。
我看过here 和here 等其他地方,感觉应该可以。我错过了什么?
澄清
“保留(ing)有关如何使用该类重命名类的信息”,我的意思是术语Inner_X 应该只出现在Inner 类中。它根本不应该出现在Outer 类中。
【问题讨论】:
-
很奇怪的要求。如果您有许多 Inner 类型的属性都具有不同的名称(InnerItem1、InnerItem2 等)怎么办?它们都应该使用相同的名称进行序列化吗?
-
感谢@Evk 的评论。对于我真正想做的事情,我永远不会有你描述的结构。
-
您很可能无法使用标准 XmlSerializer 来执行此操作,因为正如我所说的那样,这是一个奇怪且不寻常的要求,因此 XmlSerializer 类的开发人员很可能无法为此计划:)
-
@Evk、this answer 和 this answer 在我提到的问题中确实表明这应该可行。据我所知,我正在做同样的事情。有什么不同的想法吗?
-
序列化时,有一些根对象(或根对象的数组\列表)。在该根对象上 XmlType 将起作用。但是对于子对象,它不会有任何影响,因为对于子对象,属性名称被用作元素名称(这是合理的)。或者您可以使用 XmlElement 属性覆盖属性名称,如下所示。在您的两个示例中,XmlType 仅适用于根对象。注意 - 我的意思是根不是 xml 意义上的,但在某种意义上它是您正在序列化的对象的顶级对象\列表。
标签: c# xml-serialization xmlserializer