首页 话题 小组 问答 好文 用户 我的社区 域名交易 唠叨

[教程]揭秘C#序列化与反序列化的奥秘:轻松掌握数据持久化技巧

发布于 2025-06-22 10:45:39
0
1493

引言在软件开发过程中,数据持久化是一个不可或缺的环节。它涉及到将内存中的数据转换为可以存储在硬盘或其他存储介质上的格式,以及从这些存储介质中恢复数据的过程。C作为一门强大的编程语言,提供了多种序列化与...

引言

在软件开发过程中,数据持久化是一个不可或缺的环节。它涉及到将内存中的数据转换为可以存储在硬盘或其他存储介质上的格式,以及从这些存储介质中恢复数据的过程。C#作为一门强大的编程语言,提供了多种序列化与反序列化的机制,使得数据持久化变得简单而高效。本文将深入探讨C#中的序列化与反序列化技术,帮助读者轻松掌握数据持久化的技巧。

一、序列化概述

1.1 什么是序列化

序列化是将对象状态转换为可以存储或传输的格式的过程。在C#中,序列化可以将对象的状态保存到文件、数据库或网络流中等。

1.2 序列化的好处

  • 数据持久化:可以将对象状态保存下来,以便在需要时恢复。
  • 数据传输:可以将对象状态通过网络传输到其他程序或服务。
  • 资源共享:可以在不同的应用程序之间共享对象状态。

二、C#中的序列化机制

C#提供了多种序列化机制,包括:

2.1 BinaryFormatter

BinaryFormatter是C#中最常用的序列化方法之一,它可以将对象序列化为二进制格式。

2.1.1 使用BinaryFormatter进行序列化

using System;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
[Serializable]
public class Person
{ public string Name; public int Age;
}
class Program
{ static void Main() { Person person = new Person { Name = "张三", Age = 30 }; BinaryFormatter formatter = new BinaryFormatter(); using (FileStream stream = new FileStream("person.dat", FileMode.Create)) { formatter.Serialize(stream, person); } }
}

2.1.2 使用BinaryFormatter进行反序列化

using System;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
[Serializable]
public class Person
{ public string Name; public int Age;
}
class Program
{ static void Main() { BinaryFormatter formatter = new BinaryFormatter(); using (FileStream stream = new FileStream("person.dat", FileMode.Open)) { Person person = (Person)formatter.Deserialize(stream); Console.WriteLine("Name: " + person.Name + ", Age: " + person.Age); } }
}

2.2 XMLSerializer

XMLSerializer可以将对象序列化为XML格式。

2.2.1 使用XMLSerializer进行序列化

using System;
using System.IO;
using System.Xml.Serialization;
[Serializable]
public class Person
{ public string Name; public int Age;
}
class Program
{ static void Main() { Person person = new Person { Name = "李四", Age = 25 }; XmlSerializer serializer = new XmlSerializer(typeof(Person)); using (StreamWriter writer = new StreamWriter("person.xml")) { serializer.Serialize(writer, person); } }
}

2.2.2 使用XMLSerializer进行反序列化

using System;
using System.IO;
using System.Xml.Serialization;
[Serializable]
public class Person
{ public string Name; public int Age;
}
class Program
{ static void Main() { XmlSerializer serializer = new XmlSerializer(typeof(Person)); using (StreamReader reader = new StreamReader("person.xml")) { Person person = (Person)serializer.Deserialize(reader); Console.WriteLine("Name: " + person.Name + ", Age: " + person.Age); } }
}

2.3 DataContractSerializer

DataContractSerializer是.NET Framework 3.0及以上版本提供的一种序列化方法,它使用XML数据交换标准。

2.3.1 使用DataContractSerializer进行序列化

using System;
using System.IO;
using System.Runtime.Serialization.DataContractSerializer;
[DataContract]
public class Person
{ [DataMember] public string Name { get; set; } [DataMember] public int Age { get; set; }
}
class Program
{ static void Main() { Person person = new Person { Name = "王五", Age = 20 }; DataContractSerializer serializer = new DataContractSerializer(typeof(Person)); using (StreamWriter writer = new StreamWriter("person.datasc")) { serializer.WriteObject(writer, person); } }
}

2.3.2 使用DataContractSerializer进行反序列化

using System;
using System.IO;
using System.Runtime.Serialization.DataContractSerializer;
[DataContract]
public class Person
{ [DataMember] public string Name { get; set; } [DataMember] public int Age { get; set; }
}
class Program
{ static void Main() { DataContractSerializer serializer = new DataContractSerializer(typeof(Person)); using (StreamReader reader = new StreamReader("person.datasc")) { Person person = (Person)serializer.ReadObject(reader); Console.WriteLine("Name: " + person.Name + ", Age: " + person.Age); } }
}

三、序列化与反序列化的注意事项

3.1 只序列化公共成员

在序列化对象时,只有公共成员会被序列化。因此,确保对象的公共成员包含所有需要持久化的数据。

3.2 处理复杂类型

对于复杂类型,如集合、数组等,需要确保它们是可序列化的。

3.3 避免循环引用

序列化过程中,循环引用会导致异常。在序列化前,需要处理循环引用问题。

3.4 安全性考虑

在序列化过程中,需要考虑安全性问题,如防止恶意代码执行。

四、总结

本文深入探讨了C#中的序列化与反序列化技术,介绍了BinaryFormatter、XMLSerializer和DataContractSerializer等常用序列化方法。通过本文的学习,读者可以轻松掌握数据持久化的技巧,为软件开发中的数据存储和传输提供有力支持。

评论
一个月内的热帖推荐
csdn大佬
Lv.1普通用户

452398

帖子

22

小组

841

积分

赞助商广告
站长交流