将对象列表写入文件

我有一个以下格式的class级推销员:

class salesman { public string name, address, email; public int sales; } 

我有另一个用户输入姓名,地址,电子邮件和销售的课程。 然后将此输入添加到列表中

 List salesmanList = new List(); 

在用户根据需要向列表中输入尽可能多的推销员之后,他们可以选择将列表保存到他们选择的文件中(我可以将其限制为.xml或.txt(这更适合))。 如何将此列表添加到文件中? 如果用户希望稍后查看记录,则还需要将该文件重新读回列表。

像这样的东西会起作用。 这使用二进制格式(加载速度最快),但相同的代码将适用于具有不同序列化程序的xml。

 using System.IO; [Serializable] class salesman { public string name, address, email; public int sales; } class Program { static void Main(string[] args) { List salesmanList = new List(); string dir = @"c:\temp"; string serializationFile = Path.Combine(dir, "salesmen.bin"); //serialize using (Stream stream = File.Open(serializationFile, FileMode.Create)) { var bformatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter(); bformatter.Serialize(stream, salesmanList); } //deserialize using (Stream stream = File.Open(serializationFile, FileMode.Open)) { var bformatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter(); List salesman = (List)bformatter.Deserialize(stream); } } } 

我刚写了一篇关于将对象数据保存到Binary,XML或Json的博客文章 ; 将对象或对象列表写入文件。 以下是以各种格式执行此操作的function。 有关详细信息,请参阅我的博文。

二进制

 ///  /// Writes the given object instance to a binary file. /// Object type (and all child types) must be decorated with the [Serializable] attribute. /// To prevent a variable from being serialized, decorate it with the [NonSerialized] attribute; cannot be applied to properties. ///  /// The type of object being written to the XML file. /// The file path to write the object instance to. /// The object instance to write to the XML file. /// If false the file will be overwritten if it already exists. If true the contents will be appended to the file. public static void WriteToBinaryFile(string filePath, T objectToWrite, bool append = false) { using (Stream stream = File.Open(filePath, append ? FileMode.Append : FileMode.Create)) { var binaryFormatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter(); binaryFormatter.Serialize(stream, objectToWrite); } } ///  /// Reads an object instance from a binary file. ///  /// The type of object to read from the XML. /// The file path to read the object instance from. /// Returns a new instance of the object read from the binary file. public static T ReadFromBinaryFile(string filePath) { using (Stream stream = File.Open(filePath, FileMode.Open)) { var binaryFormatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter(); return (T)binaryFormatter.Deserialize(stream); } } 

XML

需要System.Xml程序集包含在项目中。

 ///  /// Writes the given object instance to an XML file. /// Only Public properties and variables will be written to the file. These can be any type though, even other classes. /// If there are public properties/variables that you do not want written to the file, decorate them with the [XmlIgnore] attribute. /// Object type must have a parameterless constructor. ///  /// The type of object being written to the file. /// The file path to write the object instance to. /// The object instance to write to the file. /// If false the file will be overwritten if it already exists. If true the contents will be appended to the file. public static void WriteToXmlFile(string filePath, T objectToWrite, bool append = false) where T : new() { TextWriter writer = null; try { var serializer = new XmlSerializer(typeof(T)); writer = new StreamWriter(filePath, append); serializer.Serialize(writer, objectToWrite); } finally { if (writer != null) writer.Close(); } } ///  /// Reads an object instance from an XML file. /// Object type must have a parameterless constructor. ///  /// The type of object to read from the file. /// The file path to read the object instance from. /// Returns a new instance of the object read from the XML file. public static T ReadFromXmlFile(string filePath) where T : new() { TextReader reader = null; try { var serializer = new XmlSerializer(typeof(T)); reader = new StreamReader(filePath); return (T)serializer.Deserialize(reader); } finally { if (reader != null) reader.Close(); } } 

JSON

您必须包含对Newtonsoft.Json程序集的引用,该程序集可以从Json.NET NuGet包中获取 。

 ///  /// Writes the given object instance to a Json file. /// Object type must have a parameterless constructor. /// Only Public properties and variables will be written to the file. These can be any type though, even other classes. /// If there are public properties/variables that you do not want written to the file, decorate them with the [JsonIgnore] attribute. ///  /// The type of object being written to the file. /// The file path to write the object instance to. /// The object instance to write to the file. /// If false the file will be overwritten if it already exists. If true the contents will be appended to the file. public static void WriteToJsonFile(string filePath, T objectToWrite, bool append = false) where T : new() { TextWriter writer = null; try { var contentsToWriteToFile = JsonConvert.SerializeObject(objectToWrite); writer = new StreamWriter(filePath, append); writer.Write(contentsToWriteToFile); } finally { if (writer != null) writer.Close(); } } ///  /// Reads an object instance from an Json file. /// Object type must have a parameterless constructor. ///  /// The type of object to read from the file. /// The file path to read the object instance from. /// Returns a new instance of the object read from the Json file. public static T ReadFromJsonFile(string filePath) where T : new() { TextReader reader = null; try { reader = new StreamReader(filePath); var fileContents = reader.ReadToEnd(); return JsonConvert.DeserializeObject(fileContents); } finally { if (reader != null) reader.Close(); } } 

 // Write the list of salesman objects to file. WriteToXmlFile>("C:\salesmen.txt", salesmanList); // Read the list of salesman objects from the file back into a variable. List salesmanList = ReadFromXmlFile>("C:\salesmen.txt"); 

如果需要xml序列化,可以使用内置序列化程序。 要实现此目的,请在类中添加[Serializable]标志:

 [Serializable()] class salesman { public string name, address, email; public int sales; } 

然后,您可以覆盖“ToString()”方法,该方法将数据转换为xml字符串:

 public override string ToString() { string sData = ""; using (MemoryStream oStream = new MemoryStream()) { XmlSerializer oSerializer = new XmlSerializer(this.GetType()); oSerializer.Serialize(oStream, this); oStream.Position = 0; sData = Encoding.UTF8.GetString(oStream.ToArray()); } return sData; } 

然后只需创建一个将this.ToString()写入文件的方法。

更新上面提到的将单个条目序列化为xml。 如果您需要将整个列表序列化,那么这个想法会有所不同。 在这种情况下,如果列表的内容是可序列化的,那么列表是可序列化的,并且在某些外部类中使用序列化。

示例代码:

 [Serializable()] class salesman { public string name, address, email; public int sales; } class salesmenCollection { List salesmanList; public void SaveTo(string path){ System.IO.File.WriteAllText (path, this.ToString()); } public override string ToString() { string sData = ""; using (MemoryStream oStream = new MemoryStream()) { XmlSerializer oSerializer = new XmlSerializer(this.GetType()); oSerializer.Serialize(oStream, this); oStream.Position = 0; sData = Encoding.UTF8.GetString(oStream.ToArray()); } return sData; } } 

如果你想使用JSON,那么使用Json.NET通常是最好的方法。

如果由于某种原因您无法使用Json.NET,则可以使用.NET中的内置JSON支持。

您将需要包含以下using语句并添加System.Web.Extentsions的引用

 using System.Web.Script.Serialization; 

然后,您将使用这些来序列化和反序列化您的对象。

 //Deserialize JSON to your Object YourObject obj = new JavaScriptSerializer().Deserialize("File Contents"); //Serialize your object to JSON string sJSON = new JavaScriptSerializer().Serialize(YourObject); 

https://msdn.microsoft.com/en-us/library/system.web.script.serialization.javascriptserializer_methods(v=vs.110).aspx