序列化和反序列化

序列化是把一个内存中的对象的信息转化成一个可以持久化保存的形式,以便于保存或传输,序列化的主要作用是不同平台之间进行通信,常用的有序列化有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 序列化和反序列化的更多相关文章

  1. [.net 面向对象程序设计进阶] (12) 序列化(Serialization)(四) 快速掌握JSON的序列化和反序列化

    [.net 面向对象程序设计进阶] (12) 序列化(Serialization)(四) 快速掌握JSON的序列化和反序列化 本节导读: 介绍JSON的结构,在JS中的使用.重点说明JSON如何在.N ...

  2. 在net中json序列化与反序列化 面向对象六大原则 (第一篇) 一步一步带你了解linq to Object 10分钟浅谈泛型协变与逆变

    在net中json序列化与反序列化   准备好饮料,我们一起来玩玩JSON,什么是Json:一种数据表示形式,JSON:JavaScript Object Notation对象表示法 Json语法规则 ...

  3. (转+整理)C# BinaryFormatter进行序列化与反序列化

    序列化又称串行化,是.NET运行时环境用来支持用户定义类型的流化的机制.其目的是以某种存储形式使自定义对象持久化,或者将这种对象从一个地方传输到另一个地方. .NET框架提供了两种种串行化的方式:1. ...

  4. day5-python中的序列化与反序列化-json&pickle

    一.概述 玩过稍微大型一点的游戏的朋友都知道,很多游戏的存档功能使得我们可以方便地迅速进入上一次退出的状态(包括装备.等级.经验值等在内的一切运行时数据),那么在程序开发中也存在这样的需求:比较简单的 ...

  5. Java 中序列化与反序列化

    一. 序列化和反序列化概念 Serialization(序列化)是一种将对象以一连串的字节描述的过程:反序列化deserialization是一种将这些字节重建成一个对象的过程.将程序中的对象,放入文 ...

  6. 使用Newtonsoft.Json.dll(JSON.NET)动态解析JSON、.net 的json的序列化与反序列化(一)

    在开发中,我非常喜欢动态语言和匿名对象带来的方便,JSON.NET具有动态序列化和反序列化任意JSON内容的能力,不必将它映射到具体的强类型对象,它可以处理不确定的类型(集合.字典.动态对象和匿名对象 ...

  7. Java序列化与反序列化

    Java序列化与反序列化是什么?为什么需要序列化与反序列化?如何实现Java序列化与反序列化?本文围绕这些问题进行了探讨. 1.Java序列化与反序列化 Java序列化是指把Java对象转换为字节序列 ...

  8. java 对象序列化与反序列化

    Java序列化与反序列化是什么? 为什么需要序列化与反序列化? 如何实现Java序列化与反序列化? 本文围绕这些问题进行了探讨. 1.Java序列化与反序列化  Java序列化是指把Java对象转换为 ...

  9. Java基础学习总结——Java对象的序列化和反序列化

    一.序列化和反序列化的概念 把对象转换为字节序列的过程称为对象的序列化. 把字节序列恢复为对象的过程称为对象的反序列化. 对象的序列化主要有两种用途: 1) 把对象的字节序列永久地保存到硬盘上,通常存 ...

随机推荐

  1. MySQL-UDF和MOF提权

    MOF提权 MOF文件是mysql数据库的扩展文件(在c:/windows/system32/wbem/mof/nullevt.mof) 叫做”托管对象格式”,其作用是每隔五秒就会去监控进程创建和死亡 ...

  2. R语言:as.Date出现NA值

    > head(as.Date(data$日期,'%y%M%D'))[1] NA NA NA NA NA NA data日期格式如下: 解决办法: > head(as.Date(data$日 ...

  3. bash脚本获取绝对路径的最后一个目录名称

    比如绝对路径是/root/autoHls/streamID 因为脚本里面想直接用这个streamID来推流 下面是方法 #!/bin/bash dir="/root/autoHls" ...

  4. springboot properties

    Spring-boot中Conditional介绍 https://blog.csdn.net/tanga842428/article/details/78615070springBoot----@C ...

  5. oracle获取当前月的第一个星期五

    -to_char(trunc(sysdate,'month'),'D') end || '号是当月的第一个星期五' from dual;

  6. 性能分析 | JVM发生内存溢出的8种原因及解决办法

    推荐阅读:史上最详细JVM与性能优化知识点综合整理 1.Java 堆空间 2.GC 开销超过限制 3.请求的数组大小超过虚拟机限制 4.Perm gen 空间 5.Metaspace 6.无法新建本机 ...

  7. React里单页面div自适应浏览器高度占满屏幕

    可以用绝对定位方式,让div占满屏幕,css样式如下: height: 100%; width: 100%; position: absolute; top: 0px; bottom: 0px;

  8. 时间复杂度O(n)

    时间复杂度 算法分析 同一问题可用不同算法解决,而一个算法的质量优劣将影响到算法乃至程序的效率.算法分析的目的在于选择合适算法和改进算法.一个算法的评价主要从时间复杂度和空间复杂度来考虑. 一.时间复 ...

  9. avast关闭DeepScreen

    在“设置”-“防病毒”-去掉“启用 DeepScreen”.

  10. 树莓派使用c语言控制管脚--wiringPi安装

    树莓派先安装git,然后安装库 命令如下 git clone https://github.com/WiringPi/WiringPi cd wiringPi ./build 测试--输出管脚信息 g ...