C#序列化和反序列化

摘要:
序列化和反序列化我们可能经常会听到,其实通俗一点的解释,序列化就是把一个对象保存到一个文件或数据库字段中去,反序列化就是在适当的时候把这个文件再转化成原来的对象使用。

序列化和反序列化我们可能经常会听到,其实通俗一点的解释,序列化就是把一个对象保存到一个文件或数据库字段中去,反序列化就是在适当的时候把这个文件再转化成原来的对象使用。序列化和反序列化最主要的作用有:
1
、在进程下次启动时读取上次保存的对象的信息
2
、在不同的AppDomain或进程之间传递数据
3
、在分布式应用系统中传递数据

引用:http://www.cnblogs.com/ejiyuan/archive/2009/01/21/1379256.html

1.给要序列化的类加上Serializable特性

Code
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Text;
usingSystem.IO;
usingSystem.Runtime.Serialization;
usingSystem.Runtime.Serialization.Formatters.Binary;
//序列化靠反射实现namespaceSerializeExsample
{
//序列化就是将对象转换为容易传输的格式在各个程序之间共享
//必须给可序列化的对象加上Serializable特性[Serializable]
publicclassUser
{
//[NonSerialized]只能在字段上加上该特性表示不会序列化字段publicstringName{get;set;}
publicintAge{get;set;}
}
classProgram
{
staticvoidMain()
{
//SerailizeUseruser=newUser{Name="Sonven",Age=35};
BinaryFormatterformat
=newBinaryFormatter();
Streamstream
=newFileStream("temp.t",FileMode.Create);
format.Serialize(stream,user);
//参数为一个Stream,objectstream.Dispose();
//Deserializestream=newFileStream("temp.t",FileMode.Open,FileAccess.Read);
Usernewuser
=format.Deserialize(stream)asUser;//Deserializeif(newuser!=null)Console.WriteLine("Deserializeuser:Name{0},Age{1}",newuser.Name,newuser.Age);
stream.Dispose();
File.Delete(
"temp.t");//DeleteTempDataConsole.ReadKey();
}
}
}

2.实现序列化接口

Code
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Text;
usingSystem.IO;
usingSystem.Runtime.Serialization;
usingSystem.Runtime.Serialization.Formatters.Binary;
namespaceSerializeExsample.Custorm
{
[Serializable]
publicclassUser:ISerializable
{
publicstringName{get;set;}
publicintAge{get;set;}
publicUser(){}
//反序列化
//此构造函数用于创建反序列化后的对象publicUser(SerializationInfoinfo,StreamingContextcontext)
{
//SerializationInfo的Value键值区分大小些,如果Age改为age将抛出错误Age=(int)info.GetValue("Age",typeof(int));
//Name=info.GetValue("Name",typeof(string))asstring;}
//序列化,在里面添加要被序列化的属性
//实现ISerializable的GetObjectData方法publicvoidGetObjectData(SerializationInfoinfo,StreamingContextcontext)
{
info.AddValue(
"Age",this.Age);
//info.AddValue("Name",this.Name);}
}
classProgram
{
staticvoidMain()
{
Useruser
=newUser{Name="Jack",Age=22};
//SerializeBinaryFormatterformat=newBinaryFormatter();
Streamstream
=newFileStream("temp.t",FileMode.Create);
format.Serialize(stream,user);
stream.Dispose();
//Deserializestream=newFileStream("temp.t",FileMode.Open,FileAccess.Read);
user
=format.Deserialize(stream)asUser;
stream.Dispose();
if(user!=null)Console.WriteLine("DeserializeduserName:{0},Age:{1}",user.Name,user.Age);
Console.ReadKey();
//反序列后的对象Name为null,Age为22}
}
}

3.使用XMLSerializer

Code
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Text;
usingSystem.IO;
usingSystem.Xml;
usingSystem.Xml.Serialization;
namespaceSerializeExsample.Xml
{
publicclassUser
{
publicstringName{get;set;}
publicintAge{get;set;}
[XmlIgnore]
//忽略对属性序列化publicDateTimeRegDate{get;set;}
}
classProgram
{
staticvoidMain()
{
Useruser
=newUser{Name="Sonven",Age=35,RegDate=DateTime.Now};
//SerializeXmlSerializerserializer=newXmlSerializer(typeof(User));//Param:Type要被序列化的对象类型Streamstream=newFileStream("temp.xml",FileMode.Create);
serializer.Serialize(stream,user);
stream.Dispose();
/***********************************************
*因为RegDate应用了XmlIgnore特性,xml文件不包含
*序列化将生成XML文件类容如下,
<?xmlversion="1.0"?>
<User>
<Name>Sonven</Name>
<Age>35</Age>
</User>
******************************************
*///Deserializestream=newFileStream("temp.xml",FileMode.Open,FileAccess.Read);
user
=serializer.Deserialize(stream)asUser;
stream.Dispose();
if(user!=null)Console.WriteLine("DeserializeUserName:{0},Age:{1}",user.Name,user.Age);
Console.ReadKey();
}
}
}

源代码下载SerializeExsample.rar

免责声明:文章转载自《C#序列化和反序列化》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇MySQL管理之道:性能调优、高可用与监控》迷你书EasyUI treegrid 模糊查询、搜索下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

4种解决json日期格式问题的办法

转自:http://www.cnblogs.com/best/p/3537030.html 开发中有时候需要从服务器端返回json格式的数据,在后台代码中如果有DateTime类型的数据使用系统自带的工具类序列化后将得到一个很长的数字表示日期数据,如下所示: //设置服务器响应的结果为纯文本格式 conte...

Spring Data Redis入门示例:数据序列化 (四)

概述 RedisTemplate默认使用的是基于JDK的序列化器,所以存储在Redis的数据如果不经过相应的反序列化,看到的结果是这个样子的: 可以看到,出现了乱码,在程序层面上,不会影响程序的运行,但当出现数据错误,对数据进行排查时,就无从下手了。 序列化器 在Spring Data Redis中,用户自定义类型和存储数据之间的转换(反之亦然)由org...

C# XML序列化/反序列化类XmlSerializer使用示例

using System; using System.IO; using System.Text; using System.Xml; using System.Xml.Serialization; namespace ConsoleApplication1 { class Program { static void Ma...

hessian协议原理

Hessian 原理分析 一. 远程通讯协议的基本原理 网络通信需要做的就是将流从一台计算机传输到另外一台计算机,基于传输协议和网络 IO 来实现,其中传输协议比较出名的有 http 、 tcp 、 udp 等等, http 、 tcp 、 udp 都是在基于 Socket 概念上为某类应用场景而扩展出的传输协议,网络 IO ,主要有 bio 、 ni...

C# 对象二进制序列化

using System.Runtime.Serialization.Formatters.Binary;public class SerializationUnit{            /// <summary>    /// 把对象序列化为字节数组    /// </summary>    public static by...

redis序列化异常------------org.springframework.data.redis.serializer.SerializationException

异常信息; org.springframework.data.redis.serializer.SerializationException: Cannot deserialize; nested exception is org.springframework.core.serializer.support.SerializationFailedExce...