2013-03-15 61 views
7

我知道我可以使用Linq將字段從XML映射到預先存在的對象中的字段。在.NET Framework(或其他庫)中是否有任何功能使這種手動操作變得不那麼簡單。C# - 使用XML保存現有對象

我還想寫(並有HydrateFromXml行爲有點像AutoMapper一樣):

var myObject = new MyObject(/*ctor args*/); 

myObject = myObject.HydrateFromXml(string xml); 

編輯:

我可以使用Decorator模式或者這裏的簡單包裝對象?直接反序列化爲一種抽象包裝的類型,該抽象允許我需要的細粒度構造控制?

+1

我做了一些類似的標記與序列化屬性的屬性。然後編寫一個方法來反映已標記的屬性,然後在xml中爲內容進行挖掘以設置它們。說假設交易者之間沒有交叉和水合作用,那麼就要討論它。使用序列化來獲得一個然後設置構造函數的參數? – 2013-03-15 14:16:30

+0

在這種情況下,我可能會詢問「水合物」是什麼意思? – 2013-03-15 14:25:45

+0

@KennethK。我認爲這是問題的關鍵。我希望'myObject'上的屬性用XML中的相應值初始化,但這樣做意味着告訴程序如何去做。我正在尋找一些不涉及手動映射字段的東西,但看起來這是不可能的。 – Ben 2013-03-15 14:40:54

回答

5

您可以使用XmlSerializer做到這一點:

var serializer = new XmlSerializer(typeof(MyObject)); 

object result; 
using (TextReader reader = new StringReader(xml)) 
{ 
    result= serializer.Deserialize(reader); 
} 

var myObject = result as MyObject; 

對於一個情況,當你的對象實例已經存在檢查這個問題:Deserializing properties into a pre-existing object

+0

不需要在最後一行中的「as」 - 它只會是一個「 MyObject',所以你可以投。 – 2013-03-15 14:02:16

+2

這似乎沒有回答我的問題,因爲'result'不預先存在反序列化步驟。我想水合一個預先存在的對象實例。 – Ben 2013-03-15 14:02:52

+0

所以你根本沒有'MyObject'聲明? – MarcinJuraszek 2013-03-15 14:03:34

1

作爲一個快速的選擇,你可以使用AutoMapper。使用XmlSerializer反序列化爲一個新實例,然後使用AutoMapper從新創建的實例映射到所需的實例。