c# 序列化BinaryFormatter、SoapFormatter和XmlSerializer的區別


在C#中常見的序列化的方法主要也有三個:BinaryFormatter、SoapFormatter、XML序列化

 

1.BinaryFormatter

序列化

[Serializable] //如果要想保存某個class中的字段,必須在class前面加個這樣attribute(C#里面用中括號括起來的標志符)
public class Person
{
    public int age;

    public string name;

    [NonSerialized] //如果某個字段不想被保存,則加個這樣的標志

    public string secret;

}

class Program
{
    static void Main(string[] args)
    {

        Person person = new Person();

        person.age = 18;

        person.name = "tom";

        person.secret = "i will not tell you";

        FileStream stream = new FileStream(@"c:\temp\person.dat", FileMode.Create);

        BinaryFormatter bFormat = newBinaryFormatter();

        bFormat.Serialize(stream, person);

        stream.Close();
    }
}

 

反序列化

Person person = new Person();

FileStream stream = new FileStream(@"c:\temp\person.dat", FileMode.Open);

BinaryFormatter bFormat = new BinaryFormatter();

person = (Person)bFormat.Deserialize(stream);//反序列化得到的是一個object對象.必須做下類型轉換

stream.Close();

Console.WriteLine(person.age + person.name + person.secret);//結果為18tom.因為secret沒有有被序列化.

 

2.SoapFormatter

把數據保存成xml文件.里面除了保存的內容還有些額外的Soap信息.它的用法和BinaryFormatter一樣.只要把BinaryFormatter都替換成SoapFormatter就行.

把文件名改為person.xml

另外就是添加名稱空間:using System.Runtime.Serialization.Formatters.Soap;

這個名稱空調對就的程序集有時VS沒有自動引用.你必須手動去引用.選中project,右擊選擇Add Reference.在.NET的標簽下選擇

System.Runtime.Serialization.Formatters.Soap.然后點OK.

補充:SOAP(Simple Object Access Protocol )簡單對象訪問協議是在分散或分布式的環境中交換信息的簡單的協議,是一個基於XML的協議,它包括四個部分:SOAP封裝(envelop),封裝定義了一個描述消息中的內容是什么,是誰發送的,誰應當接受並處理它以及如何處理它們的框架;SOAP編碼規則(encoding rules),用於表示應用程序需要使用的數據類型的實例; SOAP RPC表示(RPC representation),表示遠程過程調用和應答的協定;SOAP綁定(binding),使用底層協議交換信息。

 

3.XmlSerializer

也是保存成XML文件.但沒有其他額外信息.另外它只能保存public類型的字段.而其他兩種類型能保存所以類型的字段.

序列化

Person person = new Person();

person.age = 18;

person.name = "tom";

person.secret = "i will not tell you";

FileStream stream = new FileStream(@"c:\temp\xmlFormat.xml", FileMode.Create);

XmlSerializer xmlserilize = new XmlSerializer(typeof(Person));

xmlserilize.Serialize(stream, person);

stream.Close();

 

反序列化

Person person = new Person();

FileStream stream =new FileStream(@"c:\temp\xmlFormat.xml",FileMode.Open);

XmlSerializerxmlserilize = new XmlSerializer(typeof(Person));

person = (Person)xmlserilize.Deserialize(stream);

stream.Close();

Console.WriteLine(person.age + person.name + person.secret);

 

總結:

兩個的用法大致如下:

序列化:

  1.得到一個存儲對象的類型

  2.創建一個寫入文件流

  3.定義要序列化的類型

  4.調用序列化方法

反序列化:

  1.定義一個裝載對象的類型

  2.創建一個讀出文件流

  3.定義要反序列化的類型

  4.調用反序列化方法

BinaryFormatter類進行序列化和反序列化,以縮略型二進制格式寫到一個文件中去,速度比較快,而且寫入后的文件已二進制保存有一定的保密效果。標記為NonSerialized的其他所有成員都能序列化。

采用xml序列化的方式只能保存public的字段和可讀寫的屬性,對於private等類型的字段不能進行序列化。

二進制序列化的優點: 

  1. 所有的類成員(包括只讀的)都可以被序列化;

  2. 性能非常好。

XML序列化的優點:

  1. 互操作性好;

  2. 不需要嚴格的二進制依賴;

  3. 可讀性強

SoapFormatter微軟淘汰了,,不能序列化泛型,這里就不多講了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM