序列化和反序列化

2021-05-28 16:55:22 字數 4225 閱讀 6570

引文來自:

序列化和反序列化我們可能經常會聽到,其實通俗一點的解釋,序列化就是把乙個物件儲存到乙個檔案或資料庫欄位中去,反序列化就是在適當的時候把這個檔案再轉化成原來的物件使用。

using system;

using system.collections;

using system.text;

namespace serializabletest

public string strbookname;

[nonserialized]

public string strbookpwd;

private string _bookid;

public string bookid

set

}public arraylist albookreader;

private string _bookprice;

public void setbookprice(string price)

public void write()}}

}

這個模擬較簡單,就是定義了一些public欄位和乙個可讀寫的屬性,乙個private欄位,乙個標記為[nonserialized]的字段,具體會在下面的例子中體現出來

一、binaryformatter序列化方式

1、序列化,就是給book類賦值,然後進行序列化到乙個檔案中

book book = new book();

book.bookid = "1";

book.albookreader.add("gspring");

book.albookreader.add("永春");

book.strbookname = "c#強化";

book.strbookpwd = "*****";

book.setbookprice("50.00");

binaryserialize serialize = new binaryserialize();

serialize.serialize(book);

2、反序列化

binaryserialize serialize = new binaryserialize();

book book = serialize.deserialize();

book.write();

3、測試用的

using system;

using system.collections.generic;

using system.text;

using system.io;

using system.runtime.serialization.formatters.binary;

namespace serializabletest

}public book deserialize()

return book;}}

}

主要就是呼叫system.runtime.serialization.formatters.binary空間下的binaryformatter類進行序列化和反序列化,以縮略型二進位制格式寫到乙個檔案中去,速度比較快,而且寫入後的檔案已二進位制儲存有一定的保密效果。

呼叫反序列化後的截圖如下:

也就是說除了標記為nonserialized的其他所有成員都能序列化

二、soapformatter序列化方式

呼叫序列化和反序列化的方法和上面比較類似,我就不列出來了,主要就看看soapserialize類

using system;

using system.collections.generic;

using system.text;

using system.io;

using system.runtime.serialization.formatters.soap;

namespace serializabletest

}public book deserialize()

return book;}}

}

主要就是呼叫system.runtime.serialization.formatters.soap空間下的soapformatter類進行序列化和反序列化,使用之前需要應用system.runtime.serialization.formatters.soap.dll(.net自帶的)

序列化之後的檔案是soap格式的檔案(簡單物件訪問協議(****** object access protocol,soap),是一種輕量的、簡單的、基於xml的協議,它被設計成在web上交換結構化的和固化的資訊。 soap 可以和現存的許多網際網路協議和格式結合使用,包括超文字傳輸協議(http),簡單郵件傳輸協議(smtp),多用途網際郵件擴充協議(mime)。它還支援從訊息系統到遠端過程呼叫(rpc)等大量的應用程式。soap使用基於xml的資料結構和超文字傳輸協議(http)的組合定義了乙個標準的方法來使用internet上各種不同操作環境中的分布式物件。)

呼叫反序列化之後的結果和方法一相同

三、xml序列化方式

呼叫序列化和反序列化的方法和上面比較類似,我就不列出來了,主要就看看xmlserialize類

using system;

using system.collections.generic;

using system.text;

using system.io;

using system.xml.serialization;

namespace serializabletest

}public book deserialize()

return book;}}

}

從這三個測試類我們可以看出來其實三種方法的呼叫方式都差不多,只是具體使用的類不同

xml序列化之後的檔案就是一般的乙個xml檔案:

<?xml version="1.0"?>

c#強化

*****

gspring

永春 1

輸出截圖如下:

也就是說採用xml序列化的方式只能儲存public的字段和可讀寫的屬性,對於private等型別的字段不能進行序列化

關於迴圈引用:

比如在上面的例子book類中加入如下乙個屬性:

public book relationbook;

在呼叫序列化時使用如下方法:

book book = new book();

book.bookid = "1";

book.albookreader.add("gspring");

book.albookreader.add("永春");

book.strbookname = "c#強化";

book.strbookpwd = "*****";

book.setbookprice("50.00");

book book2 = new book();

book2.bookid = "2";

book2.albookreader.add("gspring");

book2.albookreader.add("永春");

book2.strbookname = ".net強化";

book2.strbookpwd = "*****";

book2.setbookprice("40.00");

book.relationbook = book2;

book2.relationbook = book;

binaryserialize serialize = new binaryserialize();

serialize.serialize(book);

這樣就會出現迴圈引用的情況,對於binaryserialize和soapserialize可以正常序列化(.net內部進行處理了),對於xmlserialize出現這種情況會報錯:"序列化型別 serializabletest.book 的物件時檢測到迴圈引用。"

序列化和反序列化 C 序列化與反序列化。

序列化介紹 把物件用一種新的格式來表示。系列化只序列化資料。序列化不建議使用自動屬性 為什麼要序列化 將乙個複雜的物件轉換流,方便儲存與資訊交換。class program class person public int age 二進位制序列化 就是將物件變成流的過程,把物件變成byte class...

序列化和反序列化

先定義乙個類 serializable xmlroot shintech public class person set public string name set public person this 0,string.empty public person int m age,string m...

序列化和反序列化

這個例子就是使用三種不同的方式把乙個book物件進行序列化和反序列化,當然這個book類首先是可以被序列化的。book類 複製到剪貼簿 code using system using system.collections using system.text namespace serializabl...