python marshal 对象序列化和反序列化

  有时候,要把内存中的一个对象持久化保存到磁盘上,或者序列化成二进制流通过网络发送到远程主机上。Python中有很多模块提供了序列化与反序列化的功能,如:marshal, pickle, cPickle等等。今天就讲讲marshal模块。

 

  注意: marshal并不是一个通用的模块,在某些时候它是一个不被推荐使用的模块,因为使用marshal序列化的二进制数据格式还没有文档化,在不同版本的Python中,marshal的实现可能不一样。也就是说,用python2.5序列为一个对象,用python2.6的程序反序列化所得到的对象,可能与原来的对象是不一样的。但这个模块存在的意义,正如Python手册中所说:The marshal module exists mainly to support reading and writing the “pseudo-compiled” code for Python modules of .pyc files.

下面是marshal模块中定义的一些与序列化/反序列化有关的函数:

marshal.dump(value, file[, version])

  将值写入到一个打开的输出流里。参数value表示待序列化的值。file表示打开的输出流。如:以”wb”模式打开的文件,sys.stdout或者os.popen。对于一些不支持序列类的类型,dump方法将抛出ValueError异常。要特别说明一下,并不是所有类型的对象都可以使用marshal模块来序列化/反序列化的。在python2.6中,支持的类型包括:None , integers, long integers, floating point numbers, strings, Unicode objects, tuple, list, set, dict, 和 code objects。对于tuple, list, set, dict等集合对象,其中的元素必须也是上述类型之一。

marshal.load(file)

  执行与marshal.dump相反的操作,将二进制数据反序列为Python对象。下面是一个例子,演示这两个方法的使用:

# coding=gbk
 
import   marshal ,   sys ,   os
 
lst   =   [ 1 ,   ( 2 ,   " string " ) ,   { " key " :   " Value " } ]
 
# 序列化到文件中
fle   =   open ( os . path . join ( os . getcwd ( ) ,   ' fle . txt ' ) ,   'wb ' )
marshal . dump ( lst ,   fle )
10 fle . close ( )
11  
12 # 反序列化
13 fle1   =   open ( os . path . join ( os . getcwd ( ) ,   ' fle . txt ' ) ,   'rb ' )
14 lst1   =   marshal . load ( fle1 )
15 fle1 . close ( )
16  
17 # 打印结果
18 print   lst
19 print   lst1
20  
21 # ----   结果   ----
22 # [1,   (2,   'string'),   {'key':   'Value'}]
23 # [1,   (2,   'string'),   {'key':   'Value'}]

marshal.dumps(value[, version)

  该方法与上面讲的marshal.dump()功能类似,只是它返回的是序列化之后的二进制流,而不是将这些数据直接写入到文件中。

marsahl.load(string)

  将二进制流反序列化为对象。下面的一段代码,演示这两个方法的使用:

import   marshal ,   sys ,   os
 
lst   =   [ 1 ,   ( 2 ,   " string " ) ,   { " key " :   " Value " } ]
 
byt1   =   marshal . dumps ( lst )
lst1   =   marshal . loads ( byt1 )
 
# 打印结果
print   lst
10 print   lst1
11  
12 # ----   结果   ----
13 # [1,   (2,   'string'),   {'key':   'Value'}]
14 # [1,   (2,   'string'),   {'key':   'Value'}]
  

 

  更多关于marshal的内容,请参考Python手册。

您好,关于您的问题,Go语言中使用标准库中的json包进行序列化反序列化操作。具体实现方法如下: 1. 对于结构体的序列化反序列化操作 首先定义一个结构体,该结构体中的字段必须是导出(首字母大写)的,方可被序列化反序列化。 例如: ```go type Person struct { Name string `json:"name"` Age int `json:"age"` } ``` 在定义好结构体之后,即可使用json包中的Marshal函数进行序列化操作,使用Unmarshal函数进行反序列化操作。 例如: ```go // 序列化 p := Person{Name: "Tom", Age: 18} bytes, err := json.Marshal(p) if err != nil { // 处理错误 } fmt.Println(string(bytes)) // {"name":"Tom","age":18} // 反序列化 var person Person err = json.Unmarshal(bytes, &person) if err != nil { // 处理错误 } fmt.Println(person.Name) // Tom fmt.Println(person.Age) // 18 ``` 2. 对于map、slice等类型的序列化反序列化操作 对于map、slice等类型,直接使用json包中的Marshal函数进行序列化操作,使用Unmarshal函数进行反序列化操作即可。 例如: ```go // map序列化 m := map[string]interface{}{ "name": "Tom", "age": 18, } bytes, err := json.Marshal(m) if err != nil { // 处理错误 } fmt.Println(string(bytes)) // {"age":18,"name":"Tom"} // map反序列化 var data map[string]interface{} err = json.Unmarshal(bytes, &data) if err != nil { // 处理错误 } fmt.Println(data["name"]) // Tom fmt.Println(data["age"]) // 18 // slice序列化 s := []string{"hello", "world"} bytes, err := json.Marshal(s) if err != nil { // 处理错误 } fmt.Println(string(bytes)) // ["hello","world"] // slice反序列化 var data []string err = json.Unmarshal(bytes, &data) if err != nil { // 处理错误 } fmt.Println(data[0]) // hello fmt.Println(data[1]) // world ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值