亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Go中序列化與反序列化如何使用

發布時間:2023-04-17 17:36:29 來源:億速云 閱讀:107 作者:iii 欄目:開發技術

今天小編給大家分享一下Go中序列化與反序列化如何使用的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

什么是序列化與反序列化

這里引入微軟對序列化的解釋:

序列化是指將對象轉換成字節流,從而存儲對象或將對象傳輸到內存、數據庫或文件的過程。 它的主要用途是保存對象的狀態,以便能夠在需要時重新創建對象。 反向過程稱為“反序列化”。

序列化工作原理

Go中序列化與反序列化如何使用

將對象序列化為帶有數據的流。可以將此流中的對象存儲在數據庫,文件或者內存中。

在Go中如何序列化一個對象

首先 go 給我提供了便捷的 xml序列化的 API,直接使用即可,我們來看看效果

package main

import (
    "encoding/xml"
    "fmt"
)

type person struct {
    Name string
    Age  int
}

func main() {
    p1 := person{"pkc", 22}
    // xml 序列化
    if data, err := xml.Marshal(p1); err != nil{
        fmt.Println(err)
        return
    } else {
        fmt.Println(data)
        // 將 byte 轉為 string
        fmt.Println(string(data))
    }
}

這里我們初始化了一個 struct 對象,將 struct 實例化為 p1,然后使用了 Go 給我們提供的序列化API xml.Marshal,該API是返回兩個值 ([]byte, error),將結果進行字符串類型轉換后,可以得到結果,是不是看起來很熟悉的感覺呢,就像是標簽和標簽包裹的內容。

最后的結果:

[60 112 101 114 115 111 110 62 60 78 97 109 101 62 112 107 99 60 47 78 97 109 101 62 60 65 103 101 62 50 50 60 47 65 103 101 62 60 47 112 101 114 115 111 110 62]   
<person><Name>pkc</Name><Age>22</Age></person>

這時候看他,一行顯示完,好像不具備可讀性。

如何格式化序列化后的數據

這時候 Go 也給我們提供了另一個API,MarshalIndent,該API接收三個參數,分別是,(要序列化的對象,每行的前綴,縮進字符)

// 將 
xml.Marshal(p1)
// 修改為
xml.MarshalIndent(p1, "", " ")

得到結果:

[60 112 101 114 115 111 110 62 10 9 60 78 97 109 101 62 112 107 99 60 47 78 97 109 101 62 10 9 60 65 103 101 62 50 50 60 47 65 103 101 62 10 60 47 112 101 114 115 111 110 62]
<person>
        <Name>pkc</Name>
        <Age>22</Age>
</person>

這時候我們得到了一個 xml結構,但是標簽一般都會加上屬性,這時候想,如何給標簽能加上屬性呢

如何給序列化后的xml加上屬性

假設:我們要給 Person 標簽添加屬性 class,我們應該如何做

將代碼修改后:

package main

import (
    "encoding/xml"
    "fmt"
)

// `xml:"xxx,attr"`,xxx 是自定義屬性,如果不填,那屬性名就是鍵名:Class
type person struct {
    Class string `xml:"class,attr"`
    Name string
    Age  int
}

func main() {
    p1 := person{"container", "pkc", 22}
    // xml 序列化
    if data, err := xml.MarshalIndent(p1, "", " "); err != nil{
        fmt.Println(err)
        return
    } else {
        fmt.Println(data)
        // 將 byte 轉為 string
        fmt.Println(string(data))
    }
}

這里使用了Go中struct中的field tag語法 是聲明類型之后的注解,這樣就成功給標簽添加上屬性以及值了

結果:

[60 112 101 114 115 111 110 32 99 108 97 115 115 61 34 99 111 110 116 97 105 110 101 114 34 62 10 9 60 78 97 109 101 62 112 107 99 60 47 78 97 109 101 62 10 9 60 65 103 101 62 50 50 60 47 65 103 101 62 10 60 47 112 101 114 115 111 110 62]        
<person class="container">
        <Name>pkc</Name>
        <Age>22</Age>
</person>

如何將xml反序列化為一個對象

說完了序列化,那么我們拿著序列化之后的數據,如何反序列化變成我們想要的結構呢

這里Go也是提供了API,Unmarshal,該API接收兩個參數,第一個([]byte,接收反序列化后的對象),代碼修改后

package main

import (
    "encoding/xml"
    "fmt"
)

type person struct {
    Class string `xml:"class,attr"`
    Name string
    Age  int
}

func main() {
    var data []byte
    var err error

    p1 := person{"container", "pkc", 22}
    // xml 序列化
    if data, err = xml.MarshalIndent(p1, "", "  "); err != nil{
        fmt.Println(err)
        return
    }
    fmt.Println(data)
    // 將 byte 轉為 string
    fmt.Println(string(data))
    fmt.Println()

    // 創建示例接收反序列化的對象
    p2 := new(person)
    if err = xml.Unmarshal(data, p2); err != nil {
        fmt.Println(err)
        return
    }
    fmt.Printf("反序列化后:%v", p2)
}

結果:

[60 112 101 114 115 111 110 32 99 108 97 115 115 61 34 99 111 110 116 97 105 110 101 114 34 62 10 9 60 78 97 109 101 62 112 107 99 60 47 78 97 109 101 62 10 9 60 65 103 101 62 50 50 60 47 65 103 101 62 10 60 47 112 101 114 115 111 110 62]        
<person class="container">
        <Name>pkc</Name>
        <Age>22</Age>
</person>

反序列化后:&{container pkc 22}

以上就是“Go中序列化與反序列化如何使用”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

go
AI

祁阳县| 嵩明县| 泰州市| 泸西县| 鄯善县| 精河县| 丹江口市| 东莞市| 沛县| 合川市| 乌拉特中旗| 温泉县| 金寨县| 昭通市| 安新县| 淮安市| 林州市| 独山县| 芦山县| 天峻县| 称多县| 陇川县| 英吉沙县| 岳普湖县| 安图县| 黔南| 祁连县| 霍州市| 札达县| 和静县| 三原县| 吉安县| 肃宁县| 盐边县| 清原| 辰溪县| 兴隆县| 同德县| 遂昌县| 湄潭县| 大宁县|