将对象集合导出到XML文件

时间:2009-02-20 16:40:27

标签: c# xml collections export

使用C#...我有一个小应用程序,它从一个类创建对象,并将它们添加到一个对象集合中,它会沿途显示一些UI内容,以显示集合中当前所选对象的某些值(使用WPF UI)。所以我想添加让用户将他的对象集合保存到文件的功能,这样他们就可以在下次运行应用程序时将其加载回来。

我猜测XML是一种显而易见的方法,但我对如何做到这一点一无所知。那么,如何将对象集合导出或转储到xml文件中,然后,或许更重要的是,如何将该XML文件读回我的应用程序以重新创建集合?

Here is a screenshot of the app

4 个答案:

答案 0 :(得分:4)

如果您决定使用XML,那么

System.Runtime.Serialization就是您的朋友。

在我的一个测试应用程序中,我有时需要能够将对象序列化为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内容作为字符串获取,因此我可以通过多种方式保持它。如果你需要的话,建立一个直接转到磁盘的方法也很容易 虽然这对我有用,但您可能需要调整以满足自己的需求。

答案 1 :(得分:2)

XML序列化对许多情况都很好,但由于XML固有的开销,输出会有点笨重。在这种情况下,文件的内容不需要是人类可读的,因此这会打开其他选项。

JSON序列化将有助于缩小文件大小。可以在System.Web.Script.Serialization(System.Web.Extensions.dll)中找到JavaScriptSerializer。

在下面的示例中,我有一个ConfigurationItem的Typed通用列表。配置项与任何其他类一样,但属性应该是公共的,以便序列化它们。

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);

答案 2 :(得分: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>

答案 3 :(得分:0)

StackOverflow上有很多关于XML序列化的主题,包括一些关于一些隐藏的gotchyas的优秀帖子:

Saving Data Structures using Serialization

Serialization Gotchyas

相关问题