Golang Gob反序列化到已賦值的結構

2021-10-12 10:31:22 字數 2361 閱讀 9026

對於值型別的非零值,直接向目標結構賦值,否則跳過不處理;

對於引用型別的非空值,對於slice而言,若原資料len(slice)>0,使用原資料覆蓋目標資料;對於map而言,若原資料len(map)>0,遍歷原資料為目標資料賦值

因為反序列化的已賦值的map使用的是賦值的方式,所以對於在初始化時map中已有的資料,而在反序列化map資料中已經被delete掉,經過gob反序列化後是不會將初始化的資料項刪除的,需要特別注意下

驗證程式如下,感興趣的可以自己試下,也可以深入看下gob encode/decode的源**

package main

import

("encoding/gob"

"fmt"

"math/rand"

"os"

"time"

)type stwithintboolmap struct

func

main()

,}for i :=

0; i <

100; i++

} fmt.

println

("---------原結構體----------"

) fmt.

printf

("val值:%d\n結構體map data中資料數量:%d\n,切片中元素數量:%d\n"

,m.val,

len(m.mapdata)

,len

(m.slicedata)

) fmt.

println

(m.slicedata[0]

)// 將結構體內容序列化到檔案中

// 首先開啟檔案,獲取檔案控制代碼

f, err := os.

openfile

("ibmap.data"

, os.o_create|os.o_wronly,

0777

)if err !=

nil// 結構體內容寫入到檔案中

encoder := gob.

newencoder

(f) err = encoder.

encode

(m)if err !=

nil// 建立乙個新的物件,將檔案中的內容反序列化到此結構中

n := stwithintboolmap,}

for i :=

0; i <

100; i++

fmt.

println

("---------初始化結構體----------"

) fmt.

printf

("val值:%d\n結構體map data中資料數量:%d\n,切片中元素數量:%d\n"

,n.val,

len(n.mapdata)

,len

(n.slicedata)

) fmt.

println

(n.slicedata[0]

)// 開啟檔案

file, err := os.

openfile

("ibmap.data"

, os.o_create,

0777

)if err !=

nil// 反序列化

decode := gob.

newdecoder

(file)

err = decode.

decode

(&n)

if err !=

nil fmt.

println

("---------經過反序列化後的結構體----------"

) fmt.

printf

("val值:%d\n結構體map data中資料數量:%d\n,切片中元素數量:%d\n"

,n.val,

len(n.mapdata)

,len

(n.slicedata)

) fmt.

println

(n.slicedata[0]

)}// 程式執行結果

/*---------原結構體----------

val值:0

結構體map data中資料數量:52

,切片中元素數量:1

10---------初始化結構體----------

val值:5

結構體map data中資料數量:100

,切片中元素數量:1

20---------經過反序列化後的結構體----------

val值:5

結構體map data中資料數量:100

,切片中元素數量:1

10*/

序列化反序列化

只要用到網路開發啊,就一定會用到序列化反序列化。1,自定義結構體 struct test int len int type char data 10 test data test buffer.缺點 明文,只支援基本型別,不支援變長結構 2,在1的基礎上,自定義乙個緩衝類,存放乙個訊息。把訊息寫入緩...

序列化反序列化

using system using system.collections.generic using system.io using system.linq using system.text using system.threading.tasks namespace 序列化反序列化 syste...

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

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