使用C#...我有一个小应用程序,它从类创建对象,并将它们添加到对象集合中,在此过程中进行一些UI操作以显示集合中当前选定对象的某些值(使用WPF UI)。因此,我想添加让用户将对象集合保存到文件的功能,这样他们下次运行应用程序时就可以加载它。
我猜XML是一个显而易见的选择,但我对如何做一无所知。那么,如何将对象集合导出或转储到XML文件中,然后更重要的是,我该如何读取该XML文件以重新创建集合?
我猜XML是一个显而易见的选择,但我对如何做一无所知。那么,如何将对象集合导出或转储到XML文件中,然后更重要的是,我该如何读取该XML文件以重新创建集合?
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内容,以便可以通过多种方式进行持久化。如果您需要直接写入磁盘,则构建一个方法也很容易。
虽然这对我有效,但您可能需要根据自己的需求进行调整。
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);
将对象序列化为 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>