由三部分组成的问题。
我昨天发布了一个问题,询问嵌套类等(顺便说一下,这很有帮助)。 但是,现在我继续使用同一个程序,该程序利用 MDI 来跟踪多个通用存储及其各自的库存,以便在从自定义 .inv 文件打开时进行实例化。 为此,Store 类和 Record 类都可以序列化以保存到所述自定义文件。
我不知道它是什么,但我只是不明白序列化。 我非常了解这个概念,只是不是实践,所以我要求一点耐心。
第 1 部分)我以原始形式创建了一个 saveFileDialog,旨在保存我放入其中的任何文件,文件扩展名为 .inv。 现在,问题是我究竟如何向它传递一个实例化的类以允许我以后打开文件(如下)的方式保存?
第 2 部分) 对于 openFileDialog,分为两部分。
首先,在上面保存后,我该如何阅读信息? 我的意思是,我想过使用具有重命名文件扩展名的文本文档来存储所有值,以便我可以一次读取一个存储名称和记录,但由于我不了解序列化,我不知道这是否是一个好主意。
其次,我将如何实例化我尝试打开的实例? 是像创建类的一个实例一样简单,每次打开新文档时,我都会清除所有内容,然后只添加打开的文件中的值,还是比这更复杂?
这些类的代码如下,因为这会让你了解我打算保存的内容。 如果您需要任何其他代码,请告诉我。
using System.Text;
using System.Threading.Tasks;
namespace Inventory
{
[Serializable]
class Store
{
public Store() { }
public Store(string name) { }
public string name { get; set; }
public List<Record> Records { get; private set; }
}
[Serializable]
class Record
{
public Record() { }
public Record(int ID, int Quantity, double Price, string Name) { }
public int id { get; set; }
public int quantity { get; set; }
public double price { get; set; }
public string name { get; set; }
}
}
您可以使用一个简单的帮助程序来序列化/反序列化字符串(我为您构建了一个作为示例):
public static class StoreHelper
{
public static string Serialize(Store store)
{
var xmlSerializer = new XmlSerializer(typeof(Store));
var textWriter = new StringWriter();
xmlSerializer.Serialize(textWriter, store);
return textWriter.ToString();
}
public static Store Deserialize(string xml)
{
var serializer = new XmlSerializer(typeof(Store));
Store result;
using (TextReader reader = new StringReader(xml))
{
result = (Store)serializer.Deserialize(reader);
}
return result;
}
}
现在,在 MDI 应用中,你可以通过以下方式使用帮助程序管理商店 XML:
// Generate Store XML from Object.
var storeXml = StoreHelper.Serialize(myStore);
// Generate Store Object from XML.
var store = StoreHelper.Deserialize(storeXml);
现在,您可以从文件中读取/写入xml并对其进行处理。我希望这能有所帮助。
让 .NET 为你做:
private void Serialize(Store store, string path)
{
var xmlSerializer = new XmlSerializer(typeof(Store));
using (var streamWriter = new StreamWriter(path))
{
xmlSerializer.Serialize(streamWriter, store);
}
}
private Store Deserialize(string path)
{
var xmlSerializer = new XmlSerializer(typeof(Store));
using (var streamReader = new StreamReader(path))
{
return xmlSerializer.Deserialize(streamReader) as Store;
}
}