使用 C#...我有一个小应用程序,它从一个类创建对象,并将它们添加到一个对象集合中,它在显示集合中当前选定对象的某些值的过程中执行了一些 UI 工作(使用 WPF UI) . 所以我想添加让用户将他的对象集合保存到文件的功能,这样他们就可以在下次运行应用程序时将其加载回来。
我猜 XML 是一种显而易见的方法,但我对如何去做一无所知。那么,如何将对象集合导出或转储到 xml 文件中,然后,也许更重要的是,我将如何将该 XML 文件读回我的应用程序以重新创建集合?
使用 C#...我有一个小应用程序,它从一个类创建对象,并将它们添加到一个对象集合中,它在显示集合中当前选定对象的某些值的过程中执行了一些 UI 工作(使用 WPF UI) . 所以我想添加让用户将他的对象集合保存到文件的功能,这样他们就可以在下次运行应用程序时将其加载回来。
我猜 XML 是一种显而易见的方法,但我对如何去做一无所知。那么,如何将对象集合导出或转储到 xml 文件中,然后,也许更重要的是,我将如何将该 XML 文件读回我的应用程序以重新创建集合?
如果您决定使用 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 内容作为字符串获取,以便我可以通过多种方式之一来持久保存它。如果您需要的话,构建一种直接进入磁盘的方法也很容易。
尽管这对我有用,但您可能需要进行调整以满足自己的需求。
XML 序列化在许多情况下都可以并且很好,但是由于 XML 固有的开销,输出会有点大。在这种文件内容不需要人类可读的情况下,这会打开其他选项。
JSON 序列化将有助于减小文件大小。JavaScriptSerializer 可以在 System.Web.Script.Serialization (System.Web.Extensions.dll) 中找到。
在下面的示例中,我有一个 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);
Serialization to 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>