c# 序列化


序列化 反序列化简介

c#序列化又称为串行化,她的主要功能是将一个对象转换为二进制流,并将对象保存到文件或数据库中,主要目的是将对象持久化的存储到某一个地方或将对象从一个位置传送到另一个位置。
c#反序列化,她的主要功能是将序列化的文件还原为对象,供系统其它地方使用。


c#提供三种串行化的方式:
1.1 BinaryFormatter
采用二进制数据流的方式进行序列化
1.2 SoapFormatter
将数据流格式化为XML存储 和传输
1.3 XmlSerializer
将数据流转换为XML存储和传输

二、序列化 反序列化 应用

2.1 BinaryFormatter

using System;  
using System.Data;  
using System.Configuration;  
using System.Web;  
using System.Web.Security;  
using System.Web.UI;  
using System.Web.UI.WebControls;   
using System.Web.UI.HtmlControls;  
using System.IO;  
using System.Runtime.Serialization.Formatters.Binary;  
//// ﹤summary﹥  
/// 定义一个实体类  
/// ﹤/summary﹥  
[Serializable]    //加上此属性 表示此类可进行序列化
public class classTest  
{  
    public int keyId= 1;  
    public string name = "nameTest";  
    [NonSerialized]   //表示此字段不可进行序列化
    public string value = "value";  
}

下面是串行化和反串行化的方法:
复制代码代码如下:
//对一个实体类 系列化
public void xiLieHua()  
{  
    classTest test = new classTest();  
    FileStream fileTest =   
    new FileStream("c:\\test.dat", FileMode.Create);  
    BinaryFormatter b = new BinaryFormatter();  
    b.Serialize(fileTest, test);  
    fileStream.Close();  
}  

//对一个文件 反系列化
public void fanXiLieHua()  
{  
    classTest c = new classTest();  
    c.value = "valueTest";  
    FileStream fileStream =  
    new FileStream("c:\\test.dat",   
    FileMode.Open, FileAccess.Read, FileShare.Read);  
    BinaryFormatter b = new BinaryFormatter();  
    c = b.Deserialize(fileStream) as classTest;  
    Response.Write(c.KeyId);  
    Response.Write(c.value);  
    fileStream.Close();  
} 

2.2 SoapFormatter序列化

using System;  
using System.Data;  
using System.Configuration;  
using System.Web;  
using System.Web.Security;  
using System.Web.UI;  
using System.Web.UI.WebControls;   
using System.Web.UI.HtmlControls;  
using System.IO;  
using System.Runtime.Serialization.Formatters.Soap;  
//// ﹤summary﹥  
/// 定义一个实体类  
/// ﹤/summary﹥  
[Serializable]    //加上此属性 表示此类可进行序列化
public class classTest  
{  
    public int keyId= 1;  
    public string name = "nameTest";  
    [NonSerialized]   //表示此字段不可进行序列化
    public string value = "value";  
}

下面是串行化和反串行化的方法:
复制代码代码如下:
//对一个实体类 系列化
public void xiLieHua()  
{  
    classTest test = new classTest();  
    FileStream fileTest =   
    new FileStream("c:\\test.dat", FileMode.Create);  
    SoapFormatter b = new SoapFormatter();  
    b.Serialize(fileTest, test);  
    fileStream.Close();  
}  

//对一个文件 反系列化
public void fanXiLieHua()  
{  
    classTest c = new classTest();  
    c.value = "valueTest";  
    FileStream fileStream =  
    new FileStream("c:\\test.dat",   
    FileMode.Open, FileAccess.Read, FileShare.Read);  
    SoapFormatter b = new SoapFormatter();  
    c = b.Deserialize(fileStream) as classTest;  
    Response.Write(c.KeyId);  
    Response.Write(c.value);  
    fileStream.Close();  
} 

2.3 XmlSerializer

在xml序列化中
当一个字段在序列化时,需要被忽略,此时我们需要使用XmlIgnore属性,她的行为等价于NoSerialized。

   
[Serializable]  
public class test 
{  
    public string testName;  
    [XmlIgnore]  
    public string testValue;  
    public test2(string testName, string testValue)  
    {   
     test = test;
    testValue = testValue;
    }  
} 

C#序列化和反序列化方法:
复制代码代码如下:

public void XMLSerializetest()  
{  
    test c = new test("name1","nameValue");   
    XmlSerializer xmlInfo = new XmlSerializer(typeof(test));  
    Stream stream = new FileStream("c:\\testXml.XML",FileMode.Create,FileAccess.Write,FileShare.Read);  
    xmlInfo.Serialize(stream,c);  
    stream.Close();  
}  
public void XMLDeserializeTest()  
{  
    XmlSerializer xs = new XmlSerializer(typeof(Person));  
    Stream stream = new FileStream("C:\\testXml.XML",FileMode.Open,FileAccess.Read,FileShare.Read);  
    test test = xs.Deserialize(stream) as test;  
    Response.Write(test.testName);  
    Response.Write(test.testValue.ToString());   
    stream.Close();  
} 

相关阅读:
c# 序列化与反序列化