C# 序列化和反序列类对象到文件实战

在C#中,将类对象序列化和反序列化到文件是一种常见的做法,用于持久化数据或将对象状态保存到磁盘。这里有几种不同的方法可以实现这一点,我们将通过一个简单的示例来演示如何使用这些方法。

示例类

首先,我们需要定义一个类来序列化和反序列化。这里我们定义一个简单的Person类:

 

Csharp

深色版本

1public class Person
2{
3    public string Name { get; set; }
4    public int Age { get; set; }
5    public string Occupation { get; set; }
6}

1. 使用 Newtonsoft.Json

安装 Newtonsoft.Json

如果你还没有安装 Newtonsoft.Json,可以通过 NuGet 包管理器安装:

 

Sh

深色版本

Install-Package Newtonsoft.Json
示例代码
 

Csharp

深色版本

1using Newtonsoft.Json;
2using System.IO;
3
4public static void Main()
5{
6    // 创建一个 Person 对象
7    Person person = new Person { Name = "John Doe", Age = 30, Occupation = "Developer" };
8
9    // 序列化到文件
10    string path = @"C:\temp\person.json";
11    File.WriteAllText(path, JsonConvert.SerializeObject(person, Formatting.Indented));
12
13    // 从文件反序列化
14    string json = File.ReadAllText(path);
15    Person deserializedPerson = JsonConvert.DeserializeObject<Person>(json);
16    Console.WriteLine($"Deserialized: Name={deserializedPerson.Name}, Age={deserializedPerson.Age}, Occupation={deserializedPerson.Occupation}");
17}

2. 使用 System.Text.Json

示例代码
 

Csharp

深色版本

1using System.IO;
2using System.Text.Json;
3
4public static void Main()
5{
6    // 创建一个 Person 对象
7    Person person = new Person { Name = "John Doe", Age = 30, Occupation = "Developer" };
8
9    // 序列化到文件
10    string path = @"C:\temp\person.json";
11    JsonSerializer.SerializeToFile(path, person, new JsonSerializerOptions { WriteIndented = true });
12
13    // 从文件反序列化
14    Person deserializedPerson = JsonSerializer.DeserializeFromFile<Person>(path);
15    Console.WriteLine($"Deserialized: Name={deserializedPerson.Name}, Age={deserializedPerson.Age}, Occupation={deserializedPerson.Occupation}");
16}

3. 使用 XML 序列化

示例代码
 

Csharp

深色版本

1using System.IO;
2using System.Xml;
3using System.Xml.Serialization;
4
5public static void Main()
6{
7    // 创建一个 Person 对象
8    Person person = new Person { Name = "John Doe", Age = 30, Occupation = "Developer" };
9
10    // 序列化到文件
11    string path = @"C:\temp\person.xml";
12    using (TextWriter writer = new StreamWriter(path))
13    {
14        XmlSerializer serializer = new XmlSerializer(typeof(Person));
15        serializer.Serialize(writer, person);
16    }
17
18    // 从文件反序列化
19    Person deserializedPerson = null;
20    using (TextReader reader = new StreamReader(path))
21    {
22        XmlSerializer deserializer = new XmlSerializer(typeof(Person));
23        deserializedPerson = (Person)deserializer.Deserialize(reader);
24    }
25    Console.WriteLine($"Deserialized: Name={deserializedPerson.Name}, Age={deserializedPerson.Age}, Occupation={deserializedPerson.Occupation}");
26}

4. 使用 BinaryFormatter

示例代码
 

Csharp

深色版本

1using System.IO;
2using System.Runtime.Serialization.Formatters.Binary;
3
4public static void Main()
5{
6    // 创建一个 Person 对象
7    Person person = new Person { Name = "John Doe", Age = 30, Occupation = "Developer" };
8
9    // 序列化到文件
10    string path = @"C:\temp\person.bin";
11    using (FileStream stream = new FileStream(path, FileMode.Create))
12    {
13        IFormatter formatter = new BinaryFormatter();
14        formatter.Serialize(stream, person);
15    }
16
17    // 从文件反序列化
18    Person deserializedPerson = null;
19    using (FileStream stream = new FileStream(path, FileMode.Open))
20    {
21        IFormatter formatter = new BinaryFormatter();
22        deserializedPerson = (Person)formatter.Deserialize(stream);
23    }
24    Console.WriteLine($"Deserialized: Name={deserializedPerson.Name}, Age={deserializedPerson.Age}, Occupation={deserializedPerson.Occupation}");
25}

注意事项

  1. 文件路径:

    • 确保你有足够的权限写入指定的文件路径。
    • 在生产环境中,考虑到文件安全性和备份策略。
  2. 异常处理:

    • 在实际应用中,应该添加适当的异常处理逻辑,以确保程序的健壮性。
  3. 性能考虑:

    • 对于大型数据集或性能敏感的应用,考虑使用二进制格式(如BinaryFormatter)或System.Text.Json
  4. 安全性:

    • 如果你使用BinaryFormatter,请注意它存在一些安全风险,特别是当处理不可信的数据源时。考虑使用更安全的序列化方法。

  • 12
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值