2008-12-24 43 views
1

創建一個類(稱之爲FormElement)。這個類應該有一些屬性,比如它們具有數據元素的元數據(名稱,序列號,值 - 這只是一個字符串等)。有沒有辦法做對象(及其屬性)序列化爲XML?

該類具有類型驗證應用程序塊驗證類的屬性。

我想序列化到XML並反序列化它。驗證包括驗證應用程序塊屬性在內的類的所有屬性都可以在序列化之後生效。

一些建議?

+1

你在用什麼語言工作? – 2008-12-24 06:31:17

回答

0

通過說serialize,你的意思是使用官方的序列化機制,或達到類似的效果?

如果您的對象是bean,您可以使用反射來編寫一個通用服務,它接受一個類並記下它的類名和屬性。它可以類似地從XML讀取材料並生成對象(這是Apache Digester實質上所做的)。

-1

XStream是一個相當不錯的java庫。

+0

他正在尋找一個c#解決方案。 – pug 2010-07-20 11:33:45

+0

六個月前,當他問這個問題時,他沒有指定一種語言...... – Cogsy 2010-08-03 10:16:00

3

的.NET框架這個內置的,用C#你會做這樣的:

// This code serializes a class instance to an XML file: 
XmlSerializer xs = new XmlSerializer(typeof(objectToSerialize)); 

using (TextWriter writer = new StreamWriter(xmlFileName)) 
{ 
    xs.Serialize(writer, InstanceOfObjectToSerialize); 
} 

而且這個片段是如何反序列化的XML文件恢復到一個類實例的例子:

// this code creates a class instance from the file we just made: 
objectToSerialize newObject; 
XmlSerializer xs = new XmlSerializer(typeof(objectToSerialize)); 

using (TextReader reader = new StreamReader(xmlFileName)) 
{ 
    newObject = (ObjectToSerialize) xs.Deserialize(reader); 
} 

您必須用[Serializable]屬性標記您的類以使其工作。如果你想讓你的XML輸出更漂亮,你可以在你的類屬性上使用[XmlElement]和[XmlAttribute]屬性,讓它們序列化到你選擇的模式中。

+0

我會將typeof(objectToSerialize)更改爲typeof(ClassToSerialize)或objectToSerialize.GetType()。就目前而言,對於.NET新手來說,這會有點令人困惑。 – 2009-07-28 21:44:50

0

喬納森荷蘭說什麼。

但是,您也詢問了驗證。如果您使用Jonathan發佈的代碼,您的所有屬性正確地序列化和反序列化。但是如果你真的想檢查一下,你可以使用你的XmlSerializer對象設置一個屬性來爲* .xsd模式進行驗證。您可以使用Visual Studio附帶的xsd.exe命令行工具,輕鬆地從班級創建模式。

此外,它聽起來像你可能想要控制你的類的某些屬性被序列化爲屬性或元素。喬納森談到了這一點,但我想說明一個例子:

[Serializable] 
public class FormElement 
{ 
    [XmlAttribute] 
    public string Name {get; set;}; 

    [XmlAttribute] 
    public int Sequence {get; set;}; 

    [XmlAttribute] 
    public string Value {get; set;}; 

    [XmlElement] 
    public Validation OnValidate{get; set;} 

    [NonSerialized] 
    public string UnimportantProperty {get; set;}; 

} 

最後,對於每個屬性,你要序列也必須是可序列化複雜類型的類型,並且必須序列化爲XmlElements。否則,你將無法做到這一點。

相關問題