C#面向对象20 序列化和反序列化
序列化和反序列化
序列化是把一个内存中的对象的信息转化成一个可以持久化保存的形式,以便于保存或传输,序列化的主要作用是不同平台之间进行通信,常用的有序列化有json、xml、文件等
一、序列化为json
C#中用于对象和json相互转换的原生类有两个:DataContractJsonSerializer和JavaScriptSerializer,其中JavaScriptSerializer主要用于web的浏览器和服务器之间的通信。这里主要讲DataContractJsonSerializer的使用,要使用DataContractJsonSerializer,先要在项目中引用System.Runtime.Serialization。
首先准备一个测试的类Book:
[DataContract]
class Book
{
[DataMember]
public int ID { get; set; } [DataMember]
public string Name { get; set; } [DataMember]
public float Price { get; set; }
}
[DataContract]指定该类型要定义或实现一个数据协定,并可由序列化程序(如 System.Runtime.Serialization.DataContractSerializer)进行序列化。
[DataMember]当应用于类型的成员时,指定该成员是数据协定的一部分并可由 System.Runtime.Serialization.DataContractSerializer进行序列化。 然后先创建一个Book对象,实例化一个DataContractJsonSerializer实例,最后用该实例的WriteObject()方法将对象写到流中
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Json;
using System.IO; namespace 序列化Json
{
class Program
{
static void Main(string[] args)
{ Book book = new Book() { ID = , Name = "C#程序设计", Price = 79.5f };
//序列化json
DataContractJsonSerializer formatter = new DataContractJsonSerializer(typeof(Book));
using (MemoryStream stream = new MemoryStream())
{
formatter.WriteObject(stream, book);
string result = System.Text.Encoding.UTF8.GetString(stream.ToArray());
Console.WriteLine(result);
} Console.ReadKey();
}
} [DataContract]
class Book
{
[DataMember]
public int ID { get; set; } [DataMember]
public string Name { get; set; } [DataMember]
public float Price { get; set; }
}
}
将一个json格式的字符串反序列化为对象是用DataContractJsonSerializer实例的ReadObject()方法
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Json;
using System.IO; namespace 序列化Json
{
class Program
{
static void Main(string[] args)
{ //反序列化json
string oriStr = "{\"ID\":101,\"Name\":\"C#程序设计\",\"Price\":79.5}";
DataContractJsonSerializer formatter = new DataContractJsonSerializer(typeof(Book));
using (MemoryStream stream = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(oriStr)))
{
Book outBook = formatter.ReadObject(stream) as Book;
Console.WriteLine(outBook.ID);
Console.WriteLine(outBook.Name);
Console.WriteLine(outBook.Price);
}
Console.ReadKey();
}
} [DataContract]
class Book
{
[DataMember]
public int ID { get; set; } [DataMember]
public string Name { get; set; } [DataMember]
public float Price { get; set; }
}
}
把上面的json序列化与反序列为封装成泛型方法
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Json;
using System.IO; namespace 序列化Json
{
class Program
{
static void Main(string[] args)
{ Book book = new Book() { ID = , Name = "C#程序设计", Price = 79.5f }; //序列化json
string result = Serializer.ObjectToJson<Book>(book);
Console.WriteLine(result); //反序列化json
string oriStr = "{\"ID\":101,\"Name\":\"C#程序设计\",\"Price\":79.5}";
Book outBook = Serializer.JsonToObject<Book>(oriStr);
Console.WriteLine(outBook.ID);
Console.WriteLine(outBook.Name);
Console.WriteLine(outBook.Price); Console.ReadKey();
}
} public class Serializer
{
/// 将对象序列化为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 = System.Text.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(Book));
using (MemoryStream stream = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(json)))
{
T result = formatter.ReadObject(stream) as T;
return result;
}
}
} [DataContract]
class Book
{
[DataMember]
public int ID { get; set; } [DataMember]
public string Name { get; set; } [DataMember]
public float Price { get; set; }
}
}
二、序列化为xml
C#中将对象序列化和反序列化为xml的类是XmlSerializer,要引用System.Xml.Serialization
先创建一个XmlSerializer对象实例,然后用实例的Serialize的方法将对象写入到文件流中
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Serialization;
using System.IO; namespace 序列化XML
{
class Program
{
static void Main(string[] args)
{
Book book = new Book() { ID = , Name = "C#程序设计", Price = 79.5f }; XmlSerializer formatter = new XmlSerializer(typeof(Book));
using (FileStream stream = new FileStream(@"c:\book.xml", FileMode.OpenOrCreate))
{
formatter.Serialize(stream, book);
}
Console.Read(); }
} [Serializable]
public class Book
{ public int ID { get; set; }
public string Name { get; set; }
public float Price { get; set; }
} }
book.xml:
当然也可以将对象转换成对象流,然后转换成xml格式的字符串
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Serialization;
using System.IO; namespace 序列化XML
{
class Program
{
static void Main(string[] args)
{ Book book = new Book() { ID = , Name = "C#程序设计", Price = 79.5f }; XmlSerializer formatter = new XmlSerializer(typeof(Book));
using (MemoryStream stream = new MemoryStream())
{
formatter.Serialize(stream, book);
string result = System.Text.Encoding.UTF8.GetString(stream.ToArray());//转换成xml字符串
Console.WriteLine(result);
} Console.Read(); }
} [Serializable]
public class Book
{ public int ID { get; set; }
public string Name { get; set; }
public float Price { get; set; }
} }
将xml文件反序列化的方法是用XmlSerializer实例的Deserialize()方法
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Serialization;
using System.IO;
using System.Xml; namespace 序列化XML
{
class Program
{
static void Main(string[] args)
{ XmlSerializer formatter = new XmlSerializer(typeof(Book));
using (FileStream stream = new FileStream(@"c:\book.xml", FileMode.OpenOrCreate))
{
XmlReader xmlReader = new XmlTextReader(stream);
Book outBook = formatter.Deserialize(xmlReader) as Book;//反序列化
Console.WriteLine(outBook.ID);
Console.WriteLine(outBook.Name);
Console.WriteLine(outBook.Price);
} Console.Read(); }
} [Serializable]
public class Book
{ public int ID { get; set; }
public string Name { get; set; }
public float Price { get; set; }
} }
xml序列化与反序列为封装成泛型方法
class Program
{
static void Main(string[] args)
{
Book book = new Book() { ID = , Name = "C#程序设计", Price = 79.5f }; //序列化xml
Serializer.ObjectToXml(book, @"c:\book.xml"); //反序列化xml
Book outBook = Serializer.XmlToObject(book, @"c:\book.xml");
Console.WriteLine(outBook.ID);
Console.WriteLine(outBook.Name);
Console.WriteLine(outBook.Price);
Console.Read();
}
} public class Serializer
{
/// <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 = System.Text.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;
}
}
}
三、序列化为文件
C#中将对象序列化和反序列化为二进制文件的类是BinaryFormatter,要引用System.Runtime.Serialization.Formatters.Binary
先创建一个BinaryFormatter对象实例,然后用实例的Serialize的方法将对象写入到文件流中
class Program
{
static void Main(string[] args)
{
Book book = new Book() { ID = , Name = "C#程序设计", Price = 79.5f }; //序列化文件
BinaryFormatter formatter = new BinaryFormatter();
using (FileStream stream = new FileStream(@"c:\book.txt", FileMode.OpenOrCreate))
{
formatter.Serialize(stream, book);
}
Console.Read();
}
}
可以通过BinaryFormatter类型实例的Deserialize()方法把二进制文本反序列化为对象
class Program
{
static void Main(string[] args)
{
Book book = new Book() { ID = , Name = "C#程序设计", Price = 79.5f }; //序列化文件
BinaryFormatter formatter = new BinaryFormatter();
using (FileStream stream = new FileStream(@"c:\book.txt", FileMode.OpenOrCreate))
{
Book outBook = formatter.Deserialize(stream) as Book;
Console.WriteLine(outBook.ID);
Console.WriteLine(outBook.Name);
Console.WriteLine(outBook.Price);
}
Console.Read();
}
}
把序列化和把序列化为二进制文件的方法封装成泛型方法
class Program
{
static void Main(string[] args)
{
Book book = new Book() { ID = , Name = "C#程序设计", Price = 79.5f };
//序列化文件
Serializer.ObjectToFile(book, @"c:\book.txt"); //反序列化文件
Book outBook = Serializer.FileToObject<Book>(@"c:\book.txt") as Book;
Console.WriteLine(outBook.ID);
Console.WriteLine(outBook.Name);
Console.WriteLine(outBook.Price);
Console.Read();
}
} public class Serializer
{
#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 = System.Text.Encoding.UTF8.GetString(stream.ToArray());
return result;
}
} /// <summary>
/// 将对象序列化为文件
/// </summary>
/// <typeparam name="T">类型</typeparam>
/// <param name="t">实例</param>
/// <param name="path">存放路径</param>
public static void ObjectToFile<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 = System.Text.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 FileToObject<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
} [Serializable]
public class Book
{
public int ID { get; set; }
public string Name { get; set; }
public float Price { get; set; }
}
转自:http://www.cnblogs.com/maitian-lf/p/3670570.html
C#面向对象20 序列化和反序列化的更多相关文章
- [.net 面向对象程序设计进阶] (12) 序列化(Serialization)(四) 快速掌握JSON的序列化和反序列化
[.net 面向对象程序设计进阶] (12) 序列化(Serialization)(四) 快速掌握JSON的序列化和反序列化 本节导读: 介绍JSON的结构,在JS中的使用.重点说明JSON如何在.N ...
- 在net中json序列化与反序列化 面向对象六大原则 (第一篇) 一步一步带你了解linq to Object 10分钟浅谈泛型协变与逆变
在net中json序列化与反序列化 准备好饮料,我们一起来玩玩JSON,什么是Json:一种数据表示形式,JSON:JavaScript Object Notation对象表示法 Json语法规则 ...
- (转+整理)C# BinaryFormatter进行序列化与反序列化
序列化又称串行化,是.NET运行时环境用来支持用户定义类型的流化的机制.其目的是以某种存储形式使自定义对象持久化,或者将这种对象从一个地方传输到另一个地方. .NET框架提供了两种种串行化的方式:1. ...
- day5-python中的序列化与反序列化-json&pickle
一.概述 玩过稍微大型一点的游戏的朋友都知道,很多游戏的存档功能使得我们可以方便地迅速进入上一次退出的状态(包括装备.等级.经验值等在内的一切运行时数据),那么在程序开发中也存在这样的需求:比较简单的 ...
- Java 中序列化与反序列化
一. 序列化和反序列化概念 Serialization(序列化)是一种将对象以一连串的字节描述的过程:反序列化deserialization是一种将这些字节重建成一个对象的过程.将程序中的对象,放入文 ...
- 使用Newtonsoft.Json.dll(JSON.NET)动态解析JSON、.net 的json的序列化与反序列化(一)
在开发中,我非常喜欢动态语言和匿名对象带来的方便,JSON.NET具有动态序列化和反序列化任意JSON内容的能力,不必将它映射到具体的强类型对象,它可以处理不确定的类型(集合.字典.动态对象和匿名对象 ...
- Java序列化与反序列化
Java序列化与反序列化是什么?为什么需要序列化与反序列化?如何实现Java序列化与反序列化?本文围绕这些问题进行了探讨. 1.Java序列化与反序列化 Java序列化是指把Java对象转换为字节序列 ...
- java 对象序列化与反序列化
Java序列化与反序列化是什么? 为什么需要序列化与反序列化? 如何实现Java序列化与反序列化? 本文围绕这些问题进行了探讨. 1.Java序列化与反序列化 Java序列化是指把Java对象转换为 ...
- Java基础学习总结——Java对象的序列化和反序列化
一.序列化和反序列化的概念 把对象转换为字节序列的过程称为对象的序列化. 把字节序列恢复为对象的过程称为对象的反序列化. 对象的序列化主要有两种用途: 1) 把对象的字节序列永久地保存到硬盘上,通常存 ...
随机推荐
- Linux设备驱动程序 之 poll和select
使用非阻塞IO的应用程序经常使用select,poll,epoll系统调用:它们的功能本质上是一样的:都允许进程决定是否可以对一个或者多个打开的文件做非阻塞的读取或者写入:这些电泳也会阻塞进程,直到给 ...
- ORA-00054: 资源正忙 --锁表的解决方法
问题描述 ORA-00054: 资源正忙, 但指定以 NOWAIT 方式获取资源, 或者超时失效 发生异常 原因:其他Session已经对目标表做了操作,且未提交操作,导致锁表,新的Session无法 ...
- P2602 [ZJOI2010]数字计数&P1239 计数器&P4999 烦人的数学作业
P2602 [ZJOI2010]数字计数 题解 DFS 恶心的数位DP 对于这道题,我们可以一个数字一个数字的求 也就是分别统计区间 [ L , R ] 内部数字 i 出现的次数 (0<=i&l ...
- 前端js数据加密解密
一.最简单的加密解密 函数escape()和unescape(); 二.base64加密 (1)introduction base64是网络上最常见的用于传输8bit字节码的编码方式之一,base ...
- C#可以直接调用的Win32API
以前整理的Win32 API,可以直接在C#中直接调用,在做WinForm时还是很有帮助的.以前用在一个多窗口界面中,当轮询窗口时,调用API会提高很多效率. 源码下载 http://files.cn ...
- Qt编写自定义控件19-图片背景时钟
前言 图片背景时钟控件,是全套控件(目前共145个)中唯一的几个贴图的控件,这个背景要是不贴图,会画到猝死,必须用美工做好的图贴图作为背景,此控件以前学C#的时候写过,后面在写Qt控件的过程中把他移植 ...
- 【JVM学习笔记】字节码文件结构
https://www.cnblogs.com/heben/p/11468285.html 比这篇笔记更好一点 新建一个Java类 package com.learn.jvm; public cla ...
- 在java中有关于反射的皮毛----自己的简略认知
白首为功名.旧山松竹老,阻归程.欲将心事付瑶琴.知音少,弦断有谁听? 反射(reflection): 当我们在看到这个名词首先会想到的是,我们在上高中时学的物理,那么在java开发中,反射这个名词是怎 ...
- Django:(02)项目配置
上一篇我们创建了一个Django项目,并且让它运行了起来了. 当是,我们还没有使用到我们创建的应用,以及templates模版目录. 需求: 在此之前我们根据需要对我们的项目进行配置修改. 在项目开发 ...
- lua学习笔记1--基础语法
print("打印日志");--单行注释 --[[ 多行注释 --]] a = --变量的类型,是由变量储存的数据决定 数据类型: number:数值类型,可以存储整数和小数 bo ...