文件 I/O 和序列化

上一期:

文件 I/O 和序列化-优快云博客

序列化

序列化是指将对象的状态转换为可以储存或传输的格式(例如:XML、JSON或二进制)的过程。反序列化这个过程的逆过程,即将这些格式的数据重新转会对象。

  • Binary Serialization:通过System.Runtime.Serialization.Formatters.Binary命名空间下的类实现,适用于需要高效存储或网络传输的情况。

  • XML Serialization:通过System.Xml.Serialization命名空间下的类实现,适用于跨平台的数据交换。

  • JSON Serialization:通常使用第三方库如Newtonsoft.Json实现,因为.NET Framework本身不直接支持JSON序列化(不过,在.NET Core和更新版本中,System.Text.Json提供了这一功能)。

使用BinaryFormatter进行序列化与反序列化

首先,确保类标记[Serializable]属性。

using System;
using System.IO;
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()
    {
        Person person = new Person { Name = "John Doe", Age = 30 };
        string path = "person.dat";

        // 序列化
        using (FileStream fs = new FileStream(path, FileMode.Create))
        {
            BinaryFormatter formatter = new BinaryFormatter();
            formatter.Serialize(fs, person);
        }

        // 反序列化
        using (FileStream fs = new FileStream(path, FileMode.Open))
        {
            BinaryFormatter formatter = new BinaryFormatter();
            Person deserializedPerson = (Person)formatter.Deserialize(fs);
            Console.WriteLine($"Name: {deserializedPerson.Name}, Age: {deserializedPerson.Age}");
        }
    }
}

需要注意的是,虽然BinaryFormatter易于使用,但由于安全性和兼容性问题,它在未来的.NET版本中可能被弃用。对于新的项目,推荐考虑其他序列化方式,比如JSON序列化。

JSON序列化示例(使用System.Text.Json
using System;
using System.IO;
using System.Text.Json;

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
}

class Program
{
    static void Main()
    {
        Person person = new Person { Name = "Jane Doe", Age = 25 };
        string path = "person.json";

        // 序列化
        string jsonString = JsonSerializer.Serialize(person);
        File.WriteAllText(path, jsonString);

        // 反序列化
        string jsonFromFile = File.ReadAllText(path);
        Person deserializedPerson = JsonSerializer.Deserialize<Person>(jsonFromFile);
        Console.WriteLine($"Name: {deserializedPerson.Name}, Age: {deserializedPerson.Age}");
    }
}
XML序列化使用步骤
  1. 定义需要序列化的类:确保类具有公共默认构造函数,并且只包含可以序列化的成员(属性或字段)。你可以使用特性(attributes)来控制如何进行序列化。

  2. 创建XmlSerializer实例:你需要一个XmlSerializer实例,它被初始化时需要知道要序列化的类型。

  3. 序列化对象:调用Serialize方法将对象序列化为XML流。

  4. 反序列化对象:调用Deserialize方法从XML流中读取并重建对象。

using System;
using System.IO;
using System.Xml.Serialization;

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }

    // 默认构造函数对于XmlSerializer是必需的
    public Person() {}

    public Person(string name, int age)
    {
        Name = name;
        Age = age;
    }
}

class Program
{
    static void Main()
    {
        // 创建一个Person对象
        Person person = new Person("John Doe", 30);

        // 创建XmlSerializer实例,指定序列化的类型
        XmlSerializer serializer = new XmlSerializer(typeof(Person));

        // 序列化对象到文件
        using (TextWriter writer = new StreamWriter("person.xml"))
        {
            serializer.Serialize(writer, person);
        }

        Console.WriteLine("Object has been serialized.");

        // 反序列化对象从文件
        using (TextReader reader = new StreamReader("person.xml"))
        {
            Person deserializedPerson = (Person)serializer.Deserialize(reader);
            Console.WriteLine($"Name: {deserializedPerson.Name}, Age: {deserializedPerson.Age}");
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

C6666888

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值