欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

淺析Go中序列化與反序列化的基本使用

 更新時(shí)間:2023年04月17日 16:47:46   作者:陪我去看海  
序列化是指將對(duì)象轉(zhuǎn)換成字節(jié)流,從而存儲(chǔ)對(duì)象或?qū)?duì)象傳輸?shù)絻?nèi)存、數(shù)據(jù)庫或文件的過程,反向過程稱為“反序列化”。本文主要介紹了Go中序列化與反序列化的基本使用,需要的可以參考一下

什么是序列化與反序列化

這里引入微軟對(duì)序列化的解釋:

序列化是指將對(duì)象轉(zhuǎn)換成字節(jié)流,從而存儲(chǔ)對(duì)象或?qū)?duì)象傳輸?shù)絻?nèi)存、數(shù)據(jù)庫或文件的過程。 它的主要用途是保存對(duì)象的狀態(tài),以便能夠在需要時(shí)重新創(chuàng)建對(duì)象。 反向過程稱為“反序列化”。

序列化工作原理

將對(duì)象序列化為帶有數(shù)據(jù)的流??梢詫⒋肆髦械膶?duì)象存儲(chǔ)在數(shù)據(jù)庫,文件或者內(nèi)存中。

在Go中如何序列化一個(gè)對(duì)象

首先 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 轉(zhuǎn)為 string
        fmt.Println(string(data))
    }
}

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

最后的結(jié)果:

[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>

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

如何格式化序列化后的數(shù)據(jù)

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

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

得到結(jié)果:

[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>

這時(shí)候我們得到了一個(gè) xml結(jié)構(gòu),但是標(biāo)簽一般都會(huì)加上屬性,這時(shí)候想,如何給標(biāo)簽?zāi)芗由蠈傩阅?/p>

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

假設(shè):我們要給 Person 標(biāo)簽添加屬性 class,我們應(yīng)該如何做

將代碼修改后:

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 轉(zhuǎn)為 string
        fmt.Println(string(data))
    }
}

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

結(jié)果:

[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反序列化為一個(gè)對(duì)象

說完了序列化,那么我們拿著序列化之后的數(shù)據(jù),如何反序列化變成我們想要的結(jié)構(gòu)呢

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

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 轉(zhuǎn)為 string
    fmt.Println(string(data))
    fmt.Println()
?
    // 創(chuàng)建示例接收反序列化的對(duì)象
    p2 := new(person)
    if err = xml.Unmarshal(data, p2); err != nil {
        fmt.Println(err)
        return
    }
    fmt.Printf("反序列化后:%v", p2)
}

結(jié)果:

[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}

到此這篇關(guān)于淺析Go中序列化與反序列化的基本使用的文章就介紹到這了,更多相關(guān)Go序列化 反序列化內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Go語言O(shè)RM框架構(gòu)造查詢條件示例詳解

    Go語言O(shè)RM框架構(gòu)造查詢條件示例詳解

    這篇文章主要為大家介紹了Go語言O(shè)RM框架構(gòu)造查詢條件示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • golang 通用Contains方法分享

    golang 通用Contains方法分享

    這篇文章主要介紹了golang 通用Contains方法分享,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • golang實(shí)現(xiàn)ping命令的完整代碼

    golang實(shí)現(xiàn)ping命令的完整代碼

    這篇文章給大家介紹了如何使用golang實(shí)現(xiàn)ping命令,文中給大家介紹了完整的實(shí)現(xiàn)代碼,并有詳細(xì)的圖文講解,對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-02-02
  • Go?語言的?:=的具體使用

    Go?語言的?:=的具體使用

    本文主要介紹了Go?語言的?:=的具體使用,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • Go語言快速入門指針Map使用示例教程

    Go語言快速入門指針Map使用示例教程

    這篇文章主要為大家介紹了Go語言快速入門指針Map示例教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • Go可變參數(shù)函數(shù)的實(shí)現(xiàn)

    Go可變參數(shù)函數(shù)的實(shí)現(xiàn)

    可變參數(shù)函數(shù)是指函數(shù)參數(shù)的某個(gè)參數(shù)可有可無,即這個(gè)參數(shù)的個(gè)數(shù)可以為0會(huì)多個(gè),可變參數(shù)函數(shù)參數(shù)在日常編程中大量使用,本文主要介紹了Go可變參數(shù)函數(shù)的實(shí)現(xiàn),感興趣的可以了解一下
    2023-12-12
  • 淺析Go設(shè)計(jì)模式之Facade(外觀)模式

    淺析Go設(shè)計(jì)模式之Facade(外觀)模式

    本文將介紹外觀模式的概念、結(jié)構(gòu)和工作原理,并提供一些在Go中實(shí)現(xiàn)外觀模式的示例代碼,通過使用外觀模式,可以降低代碼的耦合度,提高代碼的可維護(hù)性和可讀性,需要的朋友可以參考下
    2023-05-05
  • Golang單元測(cè)試與斷言編寫流程詳解

    Golang單元測(cè)試與斷言編寫流程詳解

    這篇文章主要介紹了Golang單元測(cè)試與斷言編寫流程,單元測(cè)試也是一個(gè)很重要的事情。單元測(cè)試是指在開發(fā)中,對(duì)一個(gè)函數(shù)或模塊的測(cè)試。其強(qiáng)調(diào)的是對(duì)單元進(jìn)行測(cè)試
    2022-12-12
  • 完美解決golang go get私有倉庫的問題

    完美解決golang go get私有倉庫的問題

    這篇文章主要介紹了完美解決golang go get私有倉庫的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-05-05
  • Go語言字典(map)用法實(shí)例分析【創(chuàng)建,填充,遍歷,查找,修改,刪除】

    Go語言字典(map)用法實(shí)例分析【創(chuàng)建,填充,遍歷,查找,修改,刪除】

    這篇文章主要介紹了Go語言字典(map)用法,結(jié)合實(shí)例形式較為詳細(xì)的分析了Go語言字典的創(chuàng)建、填充、遍歷、查找、修改、刪除等操作相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2017-02-02

最新評(píng)論