将对象集合导出为XML文件

5
使用C#...我有一个小应用程序,它从类创建对象,并将它们添加到对象集合中,在此过程中进行一些UI操作以显示集合中当前选定对象的某些值(使用WPF UI)。因此,我想添加让用户将对象集合保存到文件的功能,这样他们下次运行应用程序时就可以加载它。

我猜XML是一个显而易见的选择,但我对如何做一无所知。那么,如何将对象集合导出或转储到XML文件中,然后更重要的是,我该如何读取该XML文件以重新创建集合?

这里是应用程序的截图


以下内容中有没有解答您的问题? - DMCS
我相信他们已经做到了,只是通过回复的内容就能看出来。不过,我还没有时间去研究我的应用程序的这一部分。但我肯定会计划去做的,因为我想知道如何实现这个功能。 - MattSlay
4个回答

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的类型化泛型列表。 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>

@cracker 你是什么意思? - benPearce

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接