
C#序列化与反序列化
发布日期:2021-05-10 09:24:50
浏览次数:18
分类:精选文章
本文共 6127 字,大约阅读时间需要 20 分钟。
C# 序列化技术概述
1. 序列化简介
序列化是将内存中的对象信息转化为持久化存储形式,主要用于数据的保存、传输或跨平台通信。常见的序列化格式包括 JSON、XML、文件等。以下将重点讲解 C# 中的 JSON 和 XML 序列化,以及将其结果保存到文件中的实现方法。
1.1 JSON 序列化
在 C# 中,DataContractJsonSerializer
是用于将对象序列化为 JSON 格式的原生类。这使得开发者能够方便地将 C# 对象与 JSON 格式进行交互。下面是详细的实现步骤:
实现步骤
准备数据类
定义一个具有[DataContract]
属性的类,并使用 [DataMember]
标记标注需要序列化的属性:[DataContract]public class Book{ [DataMember] public int ID { get; set; } [DataMember] public string Name { get; set; } [DataMember] public float Price { get; set; }}
引入必要的命名空间
为了使用DataContractJsonSerializer
,需要引用以下命名空间: System.ServiceModel
System.ServiceModel.Web
System.Runtime.Serialization
序列化为 JSON 字符串
使用DataContractJsonSerializer
实例的 WriteObject()
方法将对象序列化为 JSON 字符串:class Program{ static void Main(string[] args) { Book book = new Book { ID = 101, Name = "C#程序设计", Price = 79.5f }; DataContractJsonSerializer formatter = new DataContractJsonSerializer(typeof(Book)); using (MemoryStream stream = new MemoryStream()) { formatter.WriteObject(stream, book); string result = Encoding.UTF8.GetString(stream.ToArray()); Console.WriteLine(result); } }}
新增 JSON 序列化方法
进一步提供一个通用的ObjectToJson
方法,可用于任何有 [DataContract]
标注的类:public static class Serializer{ public static string ObjectToJson(T obj) where T : class { DataContractJsonSerializer formatter = new DataContractJsonSerializer(typeof(T)); using (MemoryStream stream = new MemoryStream()) { formatter.WriteObject(stream, obj); return Encoding.UTF8.GetString(stream.ToArray()); } }}
5. **反序列化 JSON 为对象** 使用 `ReadObject()` 方法将 JSON 字符串反序列化为对象: ```csharp public static class Serializer { public static T JsonToObject(string json) where T : class { DataContractJsonSerializer formatter = new DataContractJsonSerializer(typeof(T)); using (MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(json))) { return formatter.ReadObject(stream) as T; } } }
1.2 XML 序列化
C# 中使用 XmlSerializer
类来实现 XML 格式的序列化和反序列化操作。以下是实现步骤:
实现步骤
引入命名空间
需要引入以下命名空间:System.Xml.Serialization
序列化为 XML 字符串或文件
使用XmlSerializer
实例的 Serialize()
方法将对象序列化为 XML 格式:class Program{ static void Main(string[] args) { Book book = new Book { ID = 101, Name = "C#程序设计", Price = 79.5f }; XmlSerializer formatter = new XmlSerializer(typeof(Book)); using (MemoryStream stream = new MemoryStream()) { formatter.Serialize(stream, book); string result = Encoding.UTF8.GetString(stream.ToArray()); Console.WriteLine(result); } }}
反序列化 XML 为对象
使用Deserialize()
方法将 XML 字符串或文件反序列化为对象:class Program{ static void Main(string[] args) { Book book = new Book { ID = 101, Name = "C#程序设计", Price = 79.5f }; XmlSerializer formatter = new XmlSerializer(typeof(Book)); using (FileStream stream = new FileStream(@"c:\book.xml", FileMode.OpenOrCreate)) { XmlReader reader = new XmlTextReader(stream); Book outBook = formatter.Deserialize(reader) as Book; Console.WriteLine(outBook.ID); Console.WriteLine(outBook.Name); Console.WriteLine(outBook.Price); } }}
新增 XML 序列化方法
提供通用的ObjectToXml
和 XmlToObject
方法:public static class Serializer{ public static bool ObjectToXml(T obj, string path) where T : class { XmlSerializer formatter = new XmlSerializer(typeof(T)); using (FileStream stream = new FileStream(path, FileMode.OpenOrCreate)) { formatter.Serialize(stream, obj); return true; } } public static T XmlToObject (string path) where T : class { XmlSerializer formatter = new XmlSerializer(typeof(T)); using (FileStream stream = new FileStream(path, FileMode.OpenOrCreate)) { XmlReader reader = new XmlTextReader(stream); return formatter.Deserialize(reader) as T; } }}
---## 1.3 保存序列化结果为文件为了方便数据的存储和传输,可以将序列化后的结果保存为二进制文件。C# 提供了 `BinaryFormatter` 类来实现此功能。### 实现步骤1. **引入命名空间** 需要引入以下命名空间: - `System.Runtime.Serialization.Formatters.Binary`2. **将对象序列化为文件** 使用 `BinaryFormatter` 实例的 `Serialize()` 方法: ```csharp class Program { static void Main(string[] args) { Book book = new Book { ID = 101, Name = "C#程序设计", Price = 79.5f }; BinaryFormatter formatter = new BinaryFormatter(); using (FileStream stream = new FileStream(@"c:\book.txt", FileMode.OpenOrCreate)) { formatter.Serialize(stream, book); } } }
反序列化文件为对象
使用Deserialize()
方法读取二进制文件并反序列化为对象:class Program{ static void Main(string[] args) { Book book = new Book { ID = 101, Name = "C#程序设计", Price = 79.5f }; BinaryFormatter formatter = new BinaryFormatter(); using (FileNotFoundException fe = new FileNotFoundException("无法打开文件", @"c:\book.txt")) { using (FileStream stream = fe.FileStream) { Book outBook = formatter.Deserialize(stream) as Book; Console.WriteLine(outBook.ID); Console.WriteLine(outBook.Name); Console.WriteLine(outBook.Price); } } }}
新增文件序列化方法
提供通用的ObjectToFile
和FileToObject
方法:public static class Serializer{ public static bool ObjectToFile
(T obj, string path) where T : class { BinaryFormatter formatter = new BinaryFormatter(); using (FileStream stream = new FileStream(path, FileMode.OpenOrCreate)) { formatter.Serialize(stream, obj); return true; } } public static T FileToObject (string path) where T : class { BinaryFormatter formatter = new BinaryFormatter(); using (FileStream stream = new FileStream(path, FileMode.Open)) { return formatter.Deserialize(stream) as T; } }}
---## 结论通过上述步骤,可以在 C# 中将对象序列化为 JSON、XML、或二进制文件,并反序列化回来。每种方法都有其优缺点,具体选择取决于需求场景。
发表评论
最新留言
不错!
[***.144.177.141]2025年05月01日 16时25分21秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
C语言程序设计梁海英答案,1.5 习题
2023-01-24
c语言编写单片机中断,C语言AVR单片机中断程序写法
2023-01-24
#pragma region、{}
2023-01-24
ddr2的上电顺序_S5PV210 DDR2初始化 28个步骤总结
2023-01-24
deque stack java_「集合系列」- 初探 java 集合框架图
2023-01-24
eclipse设置utf8编码_记住没:永远不要在 MySQL 中使用 UTF8
2023-01-24
eclipse里source的快捷方法_Eclipse快捷键/快捷操作汇总
2023-01-24
excel中最常用的30个函数_Excel玩转数据分析常用的43个函数!
2023-01-24
flink sql设置并行度_Flink 参数配置和常见参数调优
2023-01-24
go 字符串替换_Go 每日一库之 quicktemplate
2023-01-24
hive 建表_sqoop的使用之导入到hive和mysql
2023-01-24
hp工作站z8装Linux,惠普Z8G4双路最小工作站
2023-01-24
html上传图片直接保存到数据库中,Editor上传图片路径存入数据库中怎么弄?
2023-01-24
html游戏玩不了,WinXP网页游戏玩不了怎么办有哪些解决方法
2023-01-24