2009-02-20 95 views
4

使用C#...我有一個小應用程序,它可以從一個類創建對象,並將它們添加到對象集合中,並且沿途顯示一些UI內容以顯示當前選定的某些值對象在集合中(使用WPF UI)。所以我想添加讓用戶將他的對象集合保存到文件中的功能,以便他們在下次運行應用程序時將其加載回來。將對象集合導出到XML文件

我猜XML是一種顯而易見的方式,但我對如何去做一無所知。那麼,如何將一組對象導出或轉儲到xml文件中,然後,可能更重要的是,我將如何將該XML文件讀回到我的應用程序中以重新創建該集合?

Here is a screenshot of the app

+0

難道以下任何回答你的問題? – DMCS 2009-02-25 21:41:22

+0

我相信他們有,只是看着答覆。但是,我還沒有時間進入我的應用程序的那部分。我確定計劃,因爲我想知道如何做到這一點。 – MattSlay 2009-02-27 15:42:07

回答

4

System.Runtime.Serialization是你的朋友在這裏,如果你決定去XML。

在我的一個測試應用程序中,我有時需要能夠將對象作爲XML序列化,以便我可以全部脫機查看。這裏是我使用的代碼片段(沒有以任何方式進行優化,只是有一天很快就會碰撞,而且它按照我的需要運行)。

public static string ObjectToXml<T>(T objectToSerialise) 
{ 
    StringWriter Output = new StringWriter(new StringBuilder()); 
    XmlSerializer xs = new XmlSerializer(objectToSerialise.GetType()); 
    XmlSerializerNamespaces ns = new XmlSerializerNamespaces(); 
    ns.Add("MyNs", "http://www.someXmlNamespace/namespace1"); // add as many or few as you need 
    xs.Serialize(Output, objectToSerialise, ns); 
    return Output.ToString(); 
} 

之後,將數據噴出到文件中是微不足道的。

注意
我需要能夠得到XML的內容作爲一個字符串,所以我可以堅持它的一個多種方式。如果這是您所需要的,那麼構建一種直接轉到磁盤的方法也很容易。
雖然這適用於我,但您可能需要調整以滿足您自己的需求。

2

XML序列化是確定,適用於多數的情況下,但由於XML固有的開銷,輸出會有點龐大。在這種情況下,文件的內容不需要是人類可讀的,所以這打開了其他選項。

JSON序列化將幫助保持文件大小。 JavaScriptSerializer可以在System.Web.Script.Serialization(System.Web.Extensions.dll)中找到。

在下面的例子中,我有一個類型的ConfigurationItem通用列表。配置項像其他任何類一樣,但屬性應公開以供序列化。

var strFileData = System.IO.File.ReadAllText("FileName.data"); 
var jss = new JavaScriptSerializer(); 
var objItemsList = jss.Deserialize<List<ConfigurationItem>>(strFileData); 
// {insert code here tomanipulate object "objItemsList"} 
var strNewData = jss.Serialize(objItemsList); 
System.IO.File.WriteAllText("FileName.data", strNewData); 
1

系列化到XML的問題是,如果你的類被序列變化(新屬性),那麼XML不能被用來重新創建類的實例。

如果類是相當簡單的(或者即使它不是),你可以做手工:

XmlDocument doc = new XmlDocument(); 
XmlNode root = doc.CreateNode(XmlNodeType.Element,"root") 
doc.AppendChild(root) 
XmlNode newPage = doc.CreateNode(XmlNodeType.Element,"pattern") 
root.AppendChild(newPage) 
newPage.Attributes.Append(doc.CreateAttribute("Name",pattern.Name) 
foreach (Hole h in pattern.Holes) 
{ 
    XmlNode hole = doc.CreateNode(XmlNodeType.Element,"hole") 
    hole.Attributes.Append(doc.CreateAttribute("XCoord",h.Xcoord) 
    hole.Attributes.Append(doc.CreateAttribute("YCoord",h.Ycoord) 
    newPage.AppendChild(hole) 
} 
// etc 
doc.Save("output.xml") 

此代碼是粗糙的,但它會產生類似:

<root> 
    <pattern name="Pattern1"> 
    <hole XCoord="100" YCoord="50" /> 
    </pattern> 
</root>