[英]External Xml to C# Object, what is the easiest way?
我們具有從外部程序生成的XML,需要將其讀取到C#應用程序中。
我知道我們可以使用帶有[Serializable]
標記的C#類將對象加載到對象中,但是問題是我們已經擁有比Xml更加面向對象的對象。 我們不想有2套對象。
不過,我可以使用LinqToXml打開文件並填充對象。 這樣行是可行的還是真正的最佳方法是將帶有XmlElementAttribute
的[Serializable]
標簽和其他標簽一起使用到我們的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]屬性。 但是,如果我不想更改那些業務對象怎么辦?
如果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;
}
}
[Serializable]屬性啟用了二進制序列化,而不是Xml序列化。 為了支持XML序列化對象,必須具有默認的構造函數和公共可設置屬性。 如果您的對象模型滿足此要求,我會考慮使用內置的XML序列化-從長遠來看,它節省了時間。
您可以使用xslt轉換將源xml轉換為與對象模型匹配的xml格式,然后直接將轉換后的xml反序列化為對象。
您可以在頂級對象上實現IXmlSerializable ,以執行一些自定義序列化。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.