三部分问题。
昨天我发布了一个问题,询问有关嵌套类等问题(顺便提一句,很有帮助)。但是,现在我继续使用这个程序,该程序利用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; }
}
}
答案 0 :(得分:0)
您可以使用简单的帮助程序来序列化/反序列化字符串(我已经为您构建了一个字符串):
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并进行处理。 我希望这可以提供帮助。
答案 1 :(得分:0)
让.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;
}
}