2009-02-20 25 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>