C#序列化与反序列化学习笔记
本笔记摘抄自:https://www.cnblogs.com/maitian-lf/p/3670570.html,记录一下学习过程以备后续查用。
序列化是把一个内存中的对象的信息转化成一个可以持久化保存的形式,以便于保存或传输。序列化的主要作用是不同平台之间进行通信,常用的序
列化有json、xml、文件等,下面就逐个讲下这三种序列化的方法。
一、序列化为json
C#中用于对象和json相互转换的原生类有两个:DataContractJsonSerializer和JavaScriptSerializer,其中JavaScriptSerializer主要用于web浏览器和服
务器之间的通信。这里主要讲DataContractJsonSerializer的使用,要使用DataContractJsonSerializer,先要在项目中引用System.Runtime.Serialization。
首先准备一个测试的类Book:
class Program
{
/// <summary>
/// Book类
/// </summary>
[DataContract]
class Book
{
[DataMember]
public int ID { get; set; } [DataMember]
public string Name { get; set; } [DataMember]
public float Price { get; set; }
} static void Main(string[] args)
{
}
}
[DataContract]指定该类型要定义或实现一个数据协定,并可由序列化程序(如System.Runtime.Serialization.DataContractSerializer)进行序列化。
[DataMember]当应用于类型的成员时,指定该成员是数据协定的一部分并可由System.Runtime.Serialization.DataContractSerializer进行序列化。
首先创建一个Book对象,然后实例化一个DataContractJsonSerializer实例,最后用该实例的WriteObject()方法将对象写到流中,代码如下:
class Program
{
/// <summary>
/// Book类
/// </summary>
[DataContract]
class Book
{
[DataMember]
public int Id { get; set; } [DataMember]
public string Name { get; set; } [DataMember]
public float Price { get; set; }
} static void Main(string[] args)
{
#region 对象序列化为json
Book book = new Book() { Id = , Name = "C#程序设计", Price = 79.5f }; //序列化为json
DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(typeof(Book));
using (MemoryStream stream = new MemoryStream())
{
jsonSerializer.WriteObject(stream, book);
string result = Encoding.UTF8.GetString(stream.ToArray());
Console.WriteLine(result);
}
Console.Read();
#endregion
}
}
运行结果如下:

将一个json格式的字符串反序列化为对象是用DataContractJsonSerializer实例的ReadObject()方法,代码如下:
class Program
{
/// <summary>
/// Book类
/// </summary>
[DataContract]
class Book
{
[DataMember]
public int Id { get; set; } [DataMember]
public string Name { get; set; } [DataMember]
public float Price { get; set; }
} static void Main(string[] args)
{
#region json反序列化为对象
Book book = new Book();
//json反序列化为对象
string oriStr = "{\"Id\":101,\"Name\":\"C#程序设计\",\"Price\":79.5}";
DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(typeof(Book));
using (MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(oriStr)))
{
Book outBook = jsonSerializer.ReadObject(stream) as Book;
Console.WriteLine($"{outBook.Id} {outBook.Name} {outBook.Price}");
}
Console.Read();
#endregion
}
}
运行结果如下:

我们也可以把上面的json序列化与反序列为封装成泛型方法,这样可以公用,全部代码如下:
class Program
{
/// <summary>
/// Book类
/// </summary>
[DataContract]
class Book
{
[DataMember]
public int Id { get; set; } [DataMember]
public string Name { get; set; } [DataMember]
public float Price { get; set; }
} public class SerializerHelper
{
/// 将对象序列化为json文件
/// </summary>
/// <typeparam name="T">类型</typeparam>
/// <param name="t">实例</param>
/// <param name="path">存放路径</param>
public static void ObjectToJson<T>(T t, string path) where T : class
{
DataContractJsonSerializer formatter = new DataContractJsonSerializer(typeof(T));
using (FileStream stream = new FileStream(path, FileMode.OpenOrCreate))
{
formatter.WriteObject(stream, t);
}
} /// <summary>
/// 将对象序列化为json字符串
/// </summary>
/// <typeparam name="T">类型</typeparam>
/// <param name="t">实例</param>
/// <returns>json字符串</returns>
public static string ObjectToJson<T>(T t) where T : class
{
DataContractJsonSerializer formatter = new DataContractJsonSerializer(typeof(T));
using (MemoryStream stream = new MemoryStream())
{
formatter.WriteObject(stream, t);
string result = Encoding.UTF8.GetString(stream.ToArray());
return result;
}
} /// <summary>
/// 将json字符串反序列化为对象
/// </summary>
/// <typeparam name="T">类型</typeparam>
/// <param name="json">json格式字符串</param>
/// <returns>对象</returns>
public static T JsonToObject<T>(string json) where T : class
{
DataContractJsonSerializer formatter = new DataContractJsonSerializer(typeof(T));
using (MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(json)))
{
T result = formatter.ReadObject(stream) as T;
return result;
}
}
} static void Main(string[] args)
{
#region json序列化与反序列化泛型方法
Book book = new Book() { Id = , Name = "C#程序设计", Price = 79.5f }; //对象序列化为json
string result = SerializerHelper.ObjectToJson(book);
Console.WriteLine(result); //json反序列化为对象
string oriStr = "{\"Id\":101,\"Name\":\"C#程序设计\",\"Price\":79.5}";
Book outBook = SerializerHelper.JsonToObject<Book>(oriStr);
Console.WriteLine($"{outBook.Id} {outBook.Name} {outBook.Price}"); Console.Read();
#endregion
}
}
运行结果如下:

二、序列化为xml
C#中将对象序列化和反序列化为xml的类是XmlSerializer,要引用System.Xml.Serialization。
首先创建一个XmlSerializer对象实例,然后用实例的Serialize方法将对象写入到文件流中,代码如下:
public class Program
{
/// <summary>
/// Book类
/// </summary>
[DataContract]
public class Book
{
[DataMember]
public int Id { get; set; } [DataMember]
public string Name { get; set; } [DataMember]
public float Price { get; set; }
} static void Main(string[] args)
{
#region 对象序列化为xml(文件流)
Book book = new Book() { Id = , Name = "C#程序设计", Price = 79.5f }; XmlSerializer xmlSerializer = new XmlSerializer(typeof(Book));
using (FileStream stream = new FileStream(@"E:\book.xml", FileMode.OpenOrCreate))
{
xmlSerializer.Serialize(stream, book);
}
Console.Read();
#endregion
}
}
程序运行后会在c盘产生一个book.xml文件,内容如下:
<?xml version="1.0"?>
<Book xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Id>101</Id>
<Name>C#程序设计</Name>
<Price>79.5</Price>
</Book>
当然也可以将对象转换成对象流,然后转换成xml格式的字符串,代码如下:
public class Program
{
/// <summary>
/// Book类
/// </summary>
[DataContract]
public class Book
{
[DataMember]
public int Id { get; set; } [DataMember]
public string Name { get; set; } [DataMember]
public float Price { get; set; }
} static void Main(string[] args)
{
#region 对象序列化为xml(对象流)
Book book = new Book() { Id = , Name = "C#程序设计", Price = 79.5f }; XmlSerializer xmlSerializer = new XmlSerializer(typeof(Book));
using (MemoryStream stream = new MemoryStream())
{
xmlSerializer.Serialize(stream, book);
string result = Encoding.UTF8.GetString(stream.ToArray()); //转换成xml字符串
Console.WriteLine(result);
}
Console.Read();
#endregion
}
}
运行结果如下:

将xml文件反序列化的方法是用XmlSerializer实例的Deserialize()方法,代码如下:
public class Program
{
/// <summary>
/// Book类
/// </summary>
[DataContract]
public class Book
{
[DataMember]
public int Id { get; set; } [DataMember]
public string Name { get; set; } [DataMember]
public float Price { get; set; }
} static void Main(string[] args)
{
#region xml文件反序列化为对象
Book book = new Book() { Id = , Name = "C#程序设计", Price = 79.5f }; XmlSerializer xmlSerializer = new XmlSerializer(typeof(Book));
using (FileStream stream = new FileStream(@"E:\book.xml", FileMode.OpenOrCreate))
{
XmlReader xmlReader = new XmlTextReader(stream);
Book outBook = xmlSerializer.Deserialize(xmlReader) as Book;//反序列化
Console.WriteLine($"{outBook.Id} {outBook.Name} {outBook.Price}");
}
Console.Read();
#endregion
}
}
运行结果如下:

我们同样也可以把上面的xml序列化与反序列为封装成泛型方法,这样可以公用,全部代码如下:
public class Program
{
/// <summary>
/// Book类
/// </summary>
[DataContract]
public class Book
{
[DataMember]
public int Id { get; set; } [DataMember]
public string Name { get; set; } [DataMember]
public float Price { get; set; }
} /// <summary>
/// 序列化反序列化帮助类
/// </summary>
public class SerializerHelper
{
/// <summary>
/// 将对象序列化为xml文件
/// </summary>
/// <typeparam name="T">类型</typeparam>
/// <param name="t">对象</param>
/// <param name="path">xml存放路径</param>
public static void ObjectToXml<T>(T t, string path) where T : class
{
XmlSerializer formatter = new XmlSerializer(typeof(T));
using (FileStream stream = new FileStream(path, FileMode.OpenOrCreate))
{
formatter.Serialize(stream, t);
}
} /// <summary>
/// 将对象序列化为xml字符串
/// </summary>
/// <typeparam name="T">类型</typeparam>
/// <param name="t">对象</param>
public static string ObjectToXml<T>(T t) where T : class
{
XmlSerializer formatter = new XmlSerializer(typeof(T));
using (MemoryStream stream = new MemoryStream())
{
formatter.Serialize(stream, t);
string result = Encoding.UTF8.GetString(stream.ToArray());
return result;
}
} /// <summary>
/// 将xml文件反序列化为对象
/// </summary>
/// <typeparam name="T">类型</typeparam>
/// <param name="t">对象</param>
/// <param name="path">xml路径</param>
/// <returns>对象</returns>
public static T XmlToObject<T>(T t, string path) where T : class
{
XmlSerializer formatter = new XmlSerializer(typeof(T));
using (FileStream stream = new FileStream(path, FileMode.OpenOrCreate))
{
XmlReader xmlReader = new XmlTextReader(stream);
T result = formatter.Deserialize(xmlReader) as T;
return result;
}
}
} static void Main(string[] args)
{
#region xml序列化与反序列化泛型方法
Book book = new Book() { Id = , Name = "C#程序设计", Price = 79.5f }; //对象序列化为xml
SerializerHelper.ObjectToXml(book, @"E:\book.xml"); //xml反序列化为对象
Book outBook = SerializerHelper.XmlToObject(book, @"E:\book.xml");
Console.WriteLine($"{outBook.Id} {outBook.Name} {outBook.Price}"); Console.Read();
#endregion
}
}
三、序列化为二进制文件
C#中将对象序列化和反序列化为二进制文件的类是BinaryFormatter,要引用System.Runtime.Serialization.Formatters.Binary,另外Book类头要加
[Serializable]属性。
先创建一个BinaryFormatter对象实例,然后用实例的Serialize的方法将对象写入到文件流中,代码如下:
public class Program
{
/// <summary>
/// Book类
/// </summary>
[DataContract]
[Serializable]
public class Book
{
[DataMember]
public int Id { get; set; } [DataMember]
public string Name { get; set; } [DataMember]
public float Price { get; set; }
} static void Main(string[] args)
{
#region 对象序列化为二进制文件
Book book = new Book() { Id = , Name = "C#程序设计", Price = 79.5f }; //对象序列化为二进制文件
BinaryFormatter formatter = new BinaryFormatter();
using (FileStream stream = new FileStream(@"E:\book.txt", FileMode.OpenOrCreate))
{
formatter.Serialize(stream, book);
}
Console.Read();
#endregion
}
}
可以通过BinaryFormatter类型实例的Deserialize()方法把二进制文本反序列化为对象,代码如下:
public class Program
{
/// <summary>
/// Book类
/// </summary>
[DataContract]
[Serializable]
public class Book
{
[DataMember]
public int Id { get; set; } [DataMember]
public string Name { get; set; } [DataMember]
public float Price { get; set; }
} static void Main(string[] args)
{
#region 将二进制文件反序列化为对象
Book book = new Book() { Id = , Name = "C#程序设计", Price = 79.5f }; //序列化文件
BinaryFormatter formatter = new BinaryFormatter();
using (FileStream stream = new FileStream(@"E:\book.txt", FileMode.OpenOrCreate))
{
Book outBook = formatter.Deserialize(stream) as Book;
Console.WriteLine($"{outBook.Id} {outBook.Name} {outBook.Price}");
}
Console.Read();
#endregion
}
}
运行结果如下:

我们同样也可以把序列化和把序列化为二进制文件的方法封装成泛型方法,全部代码如下:
public class Program
{
/// <summary>
/// Book类
/// </summary>
[DataContract]
[Serializable]
public class Book
{
[DataMember]
public int Id { get; set; } [DataMember]
public string Name { get; set; } [DataMember]
public float Price { get; set; }
} /// <summary>
/// 序列化反序列化帮助类
/// </summary>
public class SerializerHelper
{
#region 二进制文件序列化反序列化
/// <summary>
/// 将对象序列化为字符串
/// </summary>
/// <typeparam name="T">类型</typeparam>
/// <param name="t">实例</param>
/// <returns>字符串</returns>
public static string ObjectToString<T>(T t)
{
BinaryFormatter formatter = new BinaryFormatter();
using (MemoryStream stream = new MemoryStream())
{
formatter.Serialize(stream, t);
string result = Encoding.UTF8.GetString(stream.ToArray());
return result;
}
} /// <summary>
/// 将对象序列化为二进制文件
/// </summary>
/// <typeparam name="T">类型</typeparam>
/// <param name="t">实例</param>
/// <param name="path">存放路径</param>
public static void ObjectToBinaryFile<T>(T t, string path)
{
BinaryFormatter formatter = new BinaryFormatter();
using (FileStream stream = new FileStream(path, FileMode.OpenOrCreate))
{
formatter.Serialize(stream, t);
stream.Flush();
}
} /// <summary>
/// 将字符串反序列为对象
/// </summary>
/// <typeparam name="T">类型</typeparam>
/// <param name="s">字符串</param>
/// <returns>对象</returns>
public static T StringToObject<T>(string s) where T : class
{
byte[] buffer = Encoding.UTF8.GetBytes(s);
BinaryFormatter formatter = new BinaryFormatter();
using (MemoryStream stream = new MemoryStream(buffer))
{
T result = formatter.Deserialize(stream) as T;
return result;
}
} /// <summary>
/// 将二进制文件反序列化为对象
/// </summary>
/// <typeparam name="T">类型</typeparam>
/// <param name="path">路径</param>
/// <returns>对象</returns>
public static T BinaryFileToObject<T>(string path) where T : class
{
using (FileStream stream = new FileStream(path, FileMode.Open))
{
BinaryFormatter formatter = new BinaryFormatter();
T result = formatter.Deserialize(stream) as T;
return result;
}
}
#endregion
} static void Main(string[] args)
{
#region 二进制文件序列化反序列化泛型方法
Book book = new Book() { Id = , Name = "C#程序设计", Price = 79.5f };
//对象序列化为二进制文件
SerializerHelper.ObjectToBinaryFile(book, @"E:\book.txt"); //二进制文件反序列化为对象
Book outBook = SerializerHelper.BinaryFileToObject<Book>(@"E:\book.txt") as Book;
Console.WriteLine($"{outBook.Id} {outBook.Name} {outBook.Price}"); Console.Read();
#endregion
}
}
运行结果如下:

C#序列化与反序列化学习笔记的更多相关文章
- java中的序列化和反序列化学习笔记
须要序列化的Person类: package cn.itcast_07; import java.io.Serializable; /* * NotSerializableException:未序列化 ...
- PHP序列化与反序列化学习
序列化与反序列化学习 把对象转换为字节序列的过程称为对象的序列化:把字节序列恢复为对象的过程称为对象的反序列化. <?php class UserInfo { public $name = &q ...
- Java序列化与反序列化学习(一)
一.序列化与反序列化概述 当两个进程在进行远程通信时,彼此可以发送各种类型的数据.无论是何种类型的数据,都会以二进制序列的形式在网络上传送.发送方需要把这个Java对象转换为字节序列,才能在网 ...
- JAVA对象序列化和反序列化学习
JAVA序列化就是将JAVA对象转化为字节序列的过程,而JAVA反序列化就是将字节序列转化为JAVA对象的过程. 这一过程是通过JAVA虚拟机独立完成,所以一个对象序列化后可以在任意时间和任意机器上反 ...
- php序列化和反序列化学习
1.什么是序列化 序列化说通俗点就是把一个对象变成可以传输的字符串. 1.举个例子,不知道大家知不知道json格式,这就是一种序列化,有可能就是通过array序列化而来的.而反序列化就是把那串可以传输 ...
- c#中对json数据的序列化和反序列化(笔记)
今天遇到在后台中要获取json格式数据里的某些值,网上查了些资料: string jsonstr = _vCustomerService.LoadCustomerbyNumTotalData(quer ...
- Java序列化与反序列化学习(三):序列化机制与原理
Java序列化算法透析 Serialization(序列化)是一种将对象以一连串的字节描述的过程:反序列化deserialization是一种将这些字节重建成一个对象的 过程.Java序列化API提供 ...
- Java序列化与反序列化学习(二):序列化接口说明
一.序列化类实现Serializable接口 Serializable接口没有方法,更像是个标记.有了这个标记的Class就能被序列化机制处理. ObjectOutputStream只能对Serial ...
- 前端JS 与 后台C# 之间JSON序列化与反序列化(笔记)
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式. 在 前端浏览器 和 后端服务器 之间通常会使用 JSON格式的数据 来进行数据交互,而JSON格式的 ...
随机推荐
- HDU 6521 K-th Closest Distance (主席树+二分)
题意: 给你一个数组,q次询问,每次问你[l,r]范围内与p距离第k大的元素的与p的距离,强制在线 思路: 主席树提取出[l,r]内的权值线段树,然后二分与p的距离mid ask该权值线段树里[p-m ...
- Go语言学习之goroutine
协程Coroutine 特点 轻量级的"线程" 非抢占式多任务处理,由协程主动交出控制权 编译器/解释器/虚拟机层面的多任务,非操作系统 多个协程可以在一个或多个线程上执行 go关 ...
- Go语言实现:【剑指offer】斐波那契数列
该题目来源于牛客网<剑指offer>专题. 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0) n<=39 Go语言实现: 递归: ...
- NLP(二十一)人物关系抽取的一次实战
去年,笔者写过一篇文章利用关系抽取构建知识图谱的一次尝试,试图用现在的深度学习办法去做开放领域的关系抽取,但是遗憾的是,目前在开放领域的关系抽取,还没有成熟的解决方案和模型.当时的文章仅作为笔者的 ...
- Linux 内存分析工具——free命令
在Linux系统经常被用作服务器系统.当服务器内存吃紧的时候,free命令是我们最常使用的内存分析工具. free使用介绍 free命令可以显示Linux系统中空闲的.已用的物理内存及swap内存,及 ...
- 如何在git搭建自己博客
1.安装Node.js和配置好Node.js环境,打开cmd命令行输入:node v.2.安装Git和配置好Git环境,打开cmd命令行输入:git --version.3.Github账户注册和新建 ...
- [Effective Java 读书笔记] 第7章 方法
第39条 必要时进行保护性拷贝 对于可变类,如果作为参数传入到自己的类里,并作为自己类的数据使用存储时,需要进行保护性拷贝,比如Date是可变的,如果传入一个Date类,最好做一个保护性拷贝,以免在调 ...
- jQuery--dataTable 前端分页与后端分页 及遇到的问题
(1)区别 前端分页:一次性把所有数据全都放在前端,由前端进行处理:适合请求的数据量不大的情况 后端分页:服务器模式,所有的分页,搜索,排序等操作在服务器端完成,然后前端去请求数据:适合量大的情况 ( ...
- Flume 自定义拦截器 多行读取日志+截断
前言: Flume百度定义如下: Flume是Cloudera提供的一个高可用的,高可靠的,分布式的海量日志采集.聚合和传输的系统,Flume支持在日志系统中定制各类数据发送方,用于收集数据:同时,F ...
- Mac下升级ruby至最新版本
Mac自身的ruby 版本 2.x,通过ruby -v可以查看版本号. 为更新到ruby的最新版本,可通过以下命令解决: brew update brew install ruby 执行完命令后,ru ...