我们从外部程序生成的XML需要读入我们的C#应用程序。
我知道我们可以使用带有[Serializable]
标记的C#类来加载对象,但问题是我们已经拥有了比Xml更加OO的对象。我们不希望有2组对象。
我的意思是我可以用LinqToXml打开文件并填满我们的对象。这样做是否可以,或者最好的方法是将[Serializable]
标签与XmlElementAttribute
和其他标签一起用于我们的OO模型? (如果最新的是一个很好的解决方案,我如何将一个属性放在我的对象中的对象中或使用继承?)。
我要说:
public class Movie {
public string Name;
public Actor LeadActor;
}
public class Actor {
public string Name;
public DateTime DOB;
}
我想像这样序列化电影:
<Movie>
<Name>Casino Royale</Name>
<LeadActor>Daniel Craig</LeadActor>
</Movie>
我认为使其工作的唯一方法是修改Movie以具有LeadActor属性,该属性将连接Actor属性并使两个Actor属性与[XmlIgnore]属性一起使用。但是,如果我不想改变这些业务对象呢?
答案 0 :(得分:2)
如果xml数据的结构已知(并且不太复杂),我发现使用Xml.Linq是最简单的方法。每个类都包含公共静态方法,用于从xml重构自身。你必须手动完成,但是如果xml结构与对象结构不对应,这似乎是唯一的方式 - 而且这个很简单。
对于你的例子,它将是:
public class Movie {
public string Name;
public Actor LeadActor;
public static Movie FromXml (XElement x)
{
Movie m = new Movie();
m.Name = x.Element("Name").Value;
m.LeadActor = Actor.FromXml(x.Element("LeadActor"));
return m;
}
}
public class Actor {
public string Name;
public DateTime DOB;
public static Actor FromXml (XElement x)
{
Actor a = new Actor();
a.Name = x.Value;
a.DOB = ...
return a;
}
}
答案 1 :(得分:1)
[Serializable]属性启用二进制序列化,而不是Xml序列化。要支持XML序列化对象,必须具有默认构造函数和公共可设置属性。如果您的对象模型满足此要求,我会考虑使用内置的XML序列化 - 从长远来看,它可以节省时间。
答案 2 :(得分:0)
您可以在顶级对象上实现IXmlSerializable来进行自定义序列化。
答案 3 :(得分:0)
您可以使用xslt转换将源xml转换为与对象模型匹配的xml格式,然后直接将转换后的xml反序列化为对象。