c# 数据类存储文件
- 行业动态
- 2025-02-25
- 10
System.IO
命名空间下的 FileStream
和 BinaryWriter
类。
在C#中,数据类存储文件主要有以下几种方式:
一、使用二进制文件存储
1、序列化与反序列化
原理:通过将对象转换为字节流来存储到文件中,C#提供了BinaryFormatter
和DataContractSerializer
等类来实现序列化和反序列化,定义一个简单的数据类Person
,包含Name
和Age
属性,使用BinaryFormatter
时,先将Person
对象序列化为字节流,然后写入到二进制文件中;读取时,再从文件中读取字节流并反序列化为Person
对象。
优点:可以精确地存储对象的状态,包括复杂的数据结构和类型信息,适合存储自定义的数据类对象。
缺点:生成的二进制文件可能不是人类可读的,不同版本的程序可能会影响二进制文件的兼容性。
2、示例代码
using System; using System.IO; using System.Runtime.Serialization; using System.Runtime.Serialization.Formatters.Binary; [Serializable] public class Person { public string Name { get; set; } public int Age { get; set; } } class Program { static void Main(string[] args) { Person person = new Person { Name = "Tom", Age = 25 }; string filePath = "person.dat"; // 序列化 FileStream fs = new FileStream(filePath, FileMode.Create); BinaryFormatter formatter = new BinaryFormatter(); formatter.Serialize(fs, person); fs.Close(); // 反序列化 fs = new FileStream(filePath, FileMode.Open); Person deserializedPerson = (Person)formatter.Deserialize(fs); fs.Close(); Console.WriteLine($"Name: {deserializedPerson.Name}, Age: {deserializedPerson.Age}"); } }
二、使用文本文件存储(如CSV、XML等)
1、CSV文件
原理:逗号分隔值文件是一种简单的文本文件格式,用于存储表格数据,可以使用StreamWriter
将数据类的属性值按照一定的格式(通常是逗号分隔)写入到CSV文件中;读取时,使用StreamReader
逐行读取文件内容,并根据逗号分隔符解析出各个属性值,然后创建相应的数据类对象。
优点:文件格式简单,易于阅读和编辑,适用于存储结构化的数据,并且可以被多种编程语言和工具所支持。
缺点:对于复杂类型的数据存储可能会比较困难,需要自行处理数据的转换和格式验证。
2、示例代码(以CSV为例)
using System; using System.IO; public class Person { public string Name { get; set; } public int Age { get; set; } } class Program { static void Main(string[] args) { Person person = new Person { Name = "Tom", Age = 25 }; string filePath = "person.csv"; // 写入CSV文件 using (StreamWriter sw = new StreamWriter(filePath)) { sw.WriteLine($"{person.Name},{person.Age}"); } // 读取CSV文件 using (StreamReader sr = new StreamReader(filePath)) { string line = sr.ReadLine(); string[] values = line.Split(','); Person readPerson = new Person { Name = values[0], Age = int.Parse(values[1]) }; Console.WriteLine($"Name: {readPerson.Name}, Age: {readPerson.Age}"); } } }
3、XML文件
原理:可扩展标记语言是一种用于描述数据的标准格式,可以利用C#中的XmlSerializer
类将数据类对象序列化为XML格式并保存到文件中;反之,也可以从XML文件中反序列化得到数据类对象,XML文件具有良好的结构性和可读性,并且支持数据的嵌套和属性的定义。
优点:具有自描述性,结构清晰,便于数据的共享和传输,可用于配置信息的存储等。
缺点:文件相对较大,解析速度可能较慢,对于简单的数据存储可能会显得过于复杂。
4、示例代码
using System; using System.IO; using System.Xml.Serialization; [Serializable] public class Person { public string Name { get; set; } public int Age { get; set; } } class Program { static void Main(string[] args) { Person person = new Person { Name = "Tom", Age = 25 }; string filePath = "person.xml"; // 序列化 XmlSerializer serializer = new XmlSerializer(typeof(Person)); using (StreamWriter sw = new StreamWriter(filePath)) { serializer.Serialize(sw, person); } // 反序列化 using (StreamReader sr = new StreamReader(filePath)) { XmlSerializer deserializer = new XmlSerializer(typeof(Person)); Person deserializedPerson = (Person)deserializer.Deserialize(sr); Console.WriteLine($"Name: {deserializedPerson.Name}, Age: {deserializedPerson.Age}"); } } }
三、使用数据库存储(如SQLite、SQL Server等)
1、SQLite数据库
原理:SQLite是一个轻量级的嵌入式数据库,无需单独的服务器进程即可运行,可以通过C#中的System.Data.SQLite
命名空间来连接和操作SQLite数据库,首先需要在项目中添加对SQLite的引用,然后创建数据库连接,通过执行SQL语句来创建表、插入数据、查询数据等操作,创建一个名为Persons
的表,包含Name
和Age
字段,然后将数据类对象的属性值插入到表中,查询时,根据条件从表中获取相应的数据记录,并将其转换为数据类对象。
优点:数据管理方便,支持复杂的查询和事务操作,适合存储大量的结构化数据。
缺点:需要额外的数据库管理系统,对于小型应用程序可能会增加一些开销。
2、示例代码
using System; using System.Data.SQLite; public class Person { public string Name { get; set; } public int Age { get; set; } } class Program { static void Main(string[] args) { string connectionString = "Data Source=person.db;Version=3;"; string createTableQuery = "CREATE TABLE IF NOT EXISTS Persons (Name TEXT, Age INTEGER)"; string insertQuery = "INSERT INTO Persons (Name, Age) VALUES (@Name, @Age)"; string selectQuery = "SELECT * FROM Persons"; // 创建数据库连接并创建表 using (SQLiteConnection connection = new SQLiteConnection(connectionString)) { connection.Open(); using (SQLiteCommand createTableCommand = new SQLiteCommand(createTableQuery, connection)) { createTableCommand.ExecuteNonQuery(); } } // 插入数据 Person person = new Person { Name = "Tom", Age = 25 }; using (SQLiteConnection connection = new SQLiteConnection(connectionString)) { connection.Open(); using (SQLiteCommand insertCommand = new SQLiteCommand(insertQuery, connection)) { insertCommand.Parameters.AddWithValue("@Name", person.Name); insertCommand.Parameters.AddWithValue("@Age", person.Age); insertCommand.ExecuteNonQuery(); } } // 查询数据 using (SQLiteConnection connection = new SQLiteConnection(connectionString)) { connection.Open(); using (SQLiteCommand selectCommand = new SQLiteCommand(selectQuery, connection)) using (SQLiteDataReader reader = selectCommand.ExecuteReader()) { while (reader.Read()) { string name = reader["Name"].ToString(); int age = Convert.ToInt32(reader["Age"]); Console.WriteLine($"Name: {name}, Age: {age}"); } } } } }
四、使用JSON文件存储(Newtonsoft.Json库)
1、原理:JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成,使用Newtonsoft.Json库可以将数据类对象序列化为JSON字符串并保存到文件中;反之,也可以从JSON文件中反序列化得到数据类对象,该库提供了丰富的API来处理JSON数据,包括对象的序列化和反序列化、查询和修改等操作。
优点:数据格式简洁明了,具有良好的可读性和可移植性,广泛应用于Web开发和数据交换领域。
缺点:对于复杂的数据结构和关系可能需要更多的处理逻辑来确保正确的序列化和反序列化。
2、示例代码
using System; using Newtonsoft.Json; // 需要在项目中安装Newtonsoft.Json包,可通过NuGet包管理器进行安装 public class Person { public string Name { get; set; } public int Age { get; set; } } class Program { static void Main(string[] args) { Person person = new Person { Name = "Tom", Age = 25 }; string filePath = "person.json"; // 序列化 string jsonString = JsonConvert.SerializeObject(person); System.IO.File.WriteAllText(filePath, jsonString); // 反序列化 string readJsonString = System.IO.File.ReadAllText(filePath); Person deserializedPerson = JsonConvert.DeserializeObject<Person>(readJsonString); Console.WriteLine($"Name: {deserializedPerson.Name}, Age: {deserializedPerson.Age}"); } }
C#中存储数据类的方法多种多样,每种方法都有其特点和适用场景,在实际开发中,应根据具体的需求选择合适的存储方式,如果需要快速存储和读取少量数据,可以选择二进制文件或文本文件;如果需要与其他应用程序共享数据或进行网络传输,可以考虑使用XML或JSON文件;如果需要对数据进行高效的管理和查询,数据库则是更好的选择,还可以结合多种存储方式,以满足复杂的业务需求。