序列化與反序列化 深入理解

2021-09-24 15:17:11 字數 1844 閱讀 4263

序列化指的是將乙個記憶體物件轉化成一串位元組資料(儲存在乙個位元組陣列中),可用於儲存到本地檔案或網路傳輸。反序列化就是將位元組資料還原成記憶體物件。

如:

struct student

;

將乙個student物件轉換成位元組資料儲存在bytearray[20]中稱為序列化**如

int count = 0;

char bytearray[20];

student s;

s.id = 12;

s.name = "specialist";

memcpy(bytearray,&s.id,sizeof(s.id));

count += sizeof(s.id);

memcpy(bytearray+count,s.name.c_str(),s.name.length());

count += s.name.length();

把位元組資料還原成student物件稱為反序列化**如

student ss;

memcpy(&ss.id,bytearray,sizeof(ss.id));

其實在上述**中存在問題只是memcpy函式隱藏了這個細節。在vs的記憶體視窗中我們可以看到s.id的記憶體檢視為0c 00 00 00(16進製制),這似乎和我們想的00 00 00 0c不一樣,這就是所謂的大端系統(記憶體中高位位元組在前)和小端系統(記憶體中低位位元組在前),而目前我們的系統大多是小端系統,而一般在網路傳輸中卻規定使用大端傳輸(如果不規定當我們將0c 00 00 00這四個位元組傳給對方,對方就不清楚這四個位元組的值?0c 00 00 00 or 00 00 00 0c),我們用memcpy函式的時候實際上就是對記憶體的拷貝,而前面講了在小端系統中對於s.id這個值拷貝到bytearray中的肯定是0c 00 00 00,然後你發過去對端接收到的是0c 00 00 00值為16的6次方(也不一定如果對端也是用的c語言直接用memcpy將0c 00 00 00拷貝s.id對應的記憶體,s.id的值還是12,就如上述**,但是客戶端和服務端的語言不一定一樣),這顯然與你想發的12差太多了 ,於是我們使用位操作(語言無關)來實現序列化與反序列化,以s.id為例**如(注意位操作針對的是數值本身而非記憶體不要搞混了)

/*s.id的值為00 00 00 0c*/

bytearray[0] = s.id>>24; //移位後隱式裝換(int)-->(char) 00 00 00 00 --> 00,下面類似

bytearray[1] = s.id>>26;

bytearray[2] = s.id>>8;

bytearray[3] = s.id;

這樣就保證了bytearray中的值為0 00 00 0c,發到對端怎麼發序列化成s.id呢?這個很容易**如

s.id += bytearray[0]<<24; //移位後隱式轉換(char)--(int) 00-->00 00 00 00,下面類似

s.id += bytearray[1]<<16;

s.id += bytearray[2]<<8;

s.id += bytearray[3];

深入理解序列化和反序列化

序列化 就是將記憶體中的物件轉換為位元組序列,方便持久化到磁碟或者網路傳輸。物件序列化過程可以分為兩步 第一 將物件轉換為位元組陣列 第二 將位元組陣列儲存到磁碟 public static byte getbytearray4object object obj throws exception p...

深入理解 XML與物件的序列化與反序列化

假設我們在乙個web專案中有這樣兩個類 複製 如下 public class member nb程式設計客棧sp public string name public class team 假設我們需要把team類的乙個例項post到乙個url,當然,使用form隱藏域提交就可以完成該功能。如果該te...

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

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