GO语言学习笔记02

go序列化与反序列化

// main project main.go
package main

import (
"encoding/binary"
"encoding/gob"
"fmt"
"os"
)

//定义结构Student对象
type Student struct {
Name string
Age int
Adress string
}

//gob序列化 (序列化就是将对象的状态信息转换为可以存储或传输的形式的过程)
//go语言标准库除了提供了gob的之外,还提供了json,binary以及base32,base64的序列化
//Gob 是 Go 中所特有的序列化技术,它支持除 interface,function,channel 外的所有 Go 数据类型。
//序列化使用 Encoder,反序列化使用 Decoder。我们可以把一个结构体序列化到文件中。然后再反序列化。
func gobFunc() {
stu := &Student{"张珊", 23, "重庆"} //创建Student对象
//创建一个dat文件
f, err = os.Create("E:\\stu.dat")
if err != nil { //如果err不为nil则表示出现异常或错误
fmt.Println(err.Error()) //打印异常或者错误信息
return //如果出现异常或者错误结束啊方法,就不向下继续执行
}
//deferf f.Close() //deferf 类似java中的finally 最终都会执行的
//创建Encoder
encode := gob.NewEncoder(f)
encode.Encode(stu) //把stu对象序列化到f文件中(E:\\stu.dat)
//重置指针到文件开始
f.Seek(0, os.SEEK_SET)

//反序列化
decod := gob.NewDecoder(f)
var stu1 Student
decod.Decode(&stu1)
fmt.Println(stu1)
}

//go语言序列化对象为二进制
func binaryFunc() {
stu := &Student{"张珊", 23, "重庆"} //创建Student对象
buf := new(bytes.Buffer)
err := binary.Write(buf, binary.LittleEndian, stu)
if err != nil {
fmt.Println(err.Error())
return
}
fmt.Printf("% x\n", buf.Bytes())

}

func main() {
//gobFunc()
binaryFunc()
}



go与xml和json

// main project main.go
package main

import (
"encoding/json"
"encoding/xml"
"fmt"
"os"
)

type Student struct {
Name string
Age int
}

//把对象序列化为xml,和反序列化
func parseToxml() {
//将创建的student对象序列化到xml
f, err := os.Create("data.dat")
if err != nil {
fmt.Println(err.Error())
return
}
defer f.Close()
s := &Student{"zbb", 20} //创建student对象
//创建encode对象
encoder := xml.NewEncoder(f)
//将s序列化到文件中
encoder.Encode(s)
//重置指针到初始位置
f.Seek(0, os.SEEK_SET)
//***编译并且运行后用编辑器打开data.bat文件其内容如下 <Student><Name>zbb</Name><Age>20</Age></Student>

//反xml序列化
decoder := xml.NewDecoder(f)
var stu1 Student
decoder.Decode(&stu1)
fmt.Println(stu1) //输出 {zbb 20}
}

//xml的Marshal函数可以直接把对象序列化为字符串
func xmlMarshal() {
s := &Student{"赵云", 26}
result, err := xml.Marshal(s)
if err != nil {
fmt.Println(err.Error())
return
}
fmt.Println(result)
fmt.Println(string(result)) //输出 <Student><Name>赵云</Name><Age>26</Age></Student>

}

//UnMarshal 可以将一个 xml 反序列化为对像
func xmlUnMarshal() {
str := "<Student><Name>赵云</Name><Age>26</Age></Student>"
var s Student
xml.Unmarshal([]byte(str), &s)
fmt.Println(s) //输出 {赵云 26}

}

//json序列化与反序列化
func jsonMarshalAndUnmarshal() {

s := &Student{"赵子龙", 26}
buf, err := json.Marshal(s)
if err != nil {
fmt.Println(err.Error())
return
}
fmt.Println(string(buf)) //输出 {"Name":"赵子龙","Age":26}

//反序列化
var stu1 Student
json.Unmarshal(buf, &stu1)
fmt.Println(stu1) //输出 {赵子龙 26}

}

func main() {
//parseToxml()
//xmlMarshal()
//xmlUnMarshal()
jsonMarshalAndUnmarshal()
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值