我想序列化以下 Xml 结构:
<XmlRootElement>
<Company name="Acme Widgets LLC">
<DbApplication name="ApplicationA" vendor="oracle">
<ConnSpec environment="DEV"
server="DBOraDev1201"
database="AppA"
userId="MyUser"
password="5613456#6%^%$%$#" />
<ConnSpec environment="QA"
server="DBOraQA1205"
database="AppA"
userId="MyUser"
password="5613456#6%^%$%$#" />
</DbApplication>
<DbApplication name="AnotherApp" "vendor="SQLServer">
<ConnSpec environment="DEV"
server="DBMsSqlDev1201"
catalog="AnoptherApp"
userId="MyUser"
password="5613456#6%^%$%$#" />
<ConnSpec environment="QA"
server="DBMsSqlQA1565"
catalog="AnotherApp"
userId="MyUser"
password="5613456#6%^%$%$#" />
</DbApplication>
</Company>
<Company name = "ExpertSoftware Inc" ....
...
</Company>
</XmlRootElement>
但是我在link text中发现了
引用上面的链接: ...
- 问:为什么不是所有的属性 集合类序列化了吗?
- A:XmlSerializer 只序列化 集合中的元素 它检测 IEnumerable 或 ICollection 接口(interface)。这个 行为是设计使然。唯一的作品 around 是重构习惯 集合分为两类,其中之一 这暴露了属性 包括其中一个纯收藏 类型。
...
在发现您无法序列化或反序列化其中包含其他 Xml 属性的集合之后...建议的解决方法是将包含该集合的元素与具有其他属性的元素分开...即,您必须更改结构,使其看起来像这样:
<XmlRootElement>
<Companys>
<Company name="Acme Widgets LLC">
<DbApplications>
<DbApplication name="ApplicationA" vendor="oracle">
<ConnSpecs>
<ConnSpec environment="DEV"
server="DBOraDev1201" ... />
<ConnSpec environment="QA"
server="DBOraQA1205"
database="AppA" ... />
</ConnSpecs>
</DbApplication>
<DbApplication name="AnotherApp" "vendor="SQLServer">
<ConnSpecs>
<ConnSpec environment="DEV" ... />
<ConnSpec environment="QA" ... />
</ConnSpecs>
</DbApplication>
</DbApplications>
</Company>
<Company name = "ExpertSoftware Inc" ....
...
</Company>
</Companys>
</XmlRootElement>
有谁知道为什么会这样吗?或者是否有其他方法可以做到这一点?
最佳答案
如果您使用 XmlSerializer您需要指示它如何序列化您的收藏:
public class XmlRootElement
{
[XmlElement(ElementName="Company")]
public Company[] Company { get; set; }
// Other properties ....
}
public class Company
{
[XmlAttribute(AttributeName="name")]
public string Name { get; set; }
[XmlElement(ElementName = "DbApplication")]
public DbApplication[] DbApplication { get; set; }
// Other properties ....
}
public class DbApplication
{
[XmlElement(ElementName = "ConnSpec")]
public ConnSpec[] ConnSpec { get; set; }
// Other properties ....
}
public class ConnSpec
{
// Other properties ....
}
然后:
using (Stream stream = new FileStream("test.xml", FileMode.Open, FileAccess.Read, FileShare.Read))
{
XmlSerializer serializer = new XmlSerializer(typeof(XmlRootElement));
XmlRootElement root = (XmlRootElement)serializer.Deserialize(stream);
}
希望这对您有所帮助。
关于.net - 集合的xml序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/326822/