Python中序列化与反序列化的区别有哪些

  

Python中序列化与反序列化的区别有哪些?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

序列化是将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态(存在内存中)写入到临时或持久性存储区(硬盘)。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。

实现对象的序列化和反序列化在Python中有两种方式:json和泡菜。

其中json用于字符串和Python数据类型间进行转换,泡菜用于Python特有的类型和Python的数据类型间进行转换,泡菜是Python特有的。

<强> 1,json序列化:json.dumps()

信息
  “name":“tj"
  “age": 22
  }
  进口json
  打印(信息)
  print(类型(信息))
  print (json.dumps(信息))
  print(类型(json.dumps(信息)))
  
  开放(f=皌est.txt",“w")
  # f.write(信息)# TypeError:写()参数必须str,不是东西
  f.write (json.dumps(信息))#正常写入文件f.write (json.dumps(信息))等价于json。转储(信息,f)
  f.close ()
  
  在在在
  {& # 39;名字# 39;:& # 39;tj # 39;, & # 39;年龄# 39;:22}
  & lt;类& # 39;dict # 39;比;
  {“name":“tj",“age": 22}
  & lt;类& # 39;str # 39;在

<强> 2,JSON反序列化:json.loads()

 f=open (“test.txt",“r")
  #打印(f.read () [“age"]) # TypeError:字符串索引必须是整数
  data=https://www.yisu.com/zixun/json.loads (f.read ()) # data=json.loads (f.read())等价于data=json.load (f)
  打印(数据(“年龄”))
  f.close ()>>
  22日

注意:对于以下这种情况json就不能处理了

进口json
  def你好(名称):
  打印(“你好,“,名称)
  信息={
  “name":“tj"
  “age": 22日
  “func":你好
  }
  开放(f=皌est2.txt",“w")
  f.write (json.dumps(信息))# TypeError:函数类型的对象不是JSON序列化
  f.close () 

所以:json用于字符串和python数据类型间进行转换

<强> 3,泡菜序列化:pickle.dumps()

进口泡菜
  def你好(名称):
  打印(“你好,“,名称)
  信息={
  “name":“tj"
  “age": 22日
  “func":你好
  }
  
  print (pickle.dumps(信息))#可见泡菜序列化的结果输出为二进制,所以应使用wb的方式往文件中写
  开放(f=皌est2.txt",“wb")
  f.write (pickle.dumps(信息))#等价于pickle.dump(信息,f)
  f.close ()
  
  在在在
  b # 39; \ x80 \ x04 \ x957 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00} \ x94 (\ x8c \ x04name \ x94 \ x8c \ x04alex \ x94 \ x8c \ x03age \ x94K \ x16 \ x8c \ x04func \ x94 \ x8c \ x08__main__ \ x94 \ x8c \ x05hello \ x94 \ x93 \ x94u强生# 39;

对于函数你好,序列化的不是内存地址,而是整个数据对象,函数可以序列化。

<强> 4,泡菜反序列化:pickle.loads()

 f=open (“test2.txt",“rb")
  data=https://www.yisu.com/zixun/pickle.loads (f.read()) #等价于data=pickle.load (f)
  打印(数据)
  打印(数据(“名字”))
  打印(数据(“函数”))>>
  {“名称”:“tj”,“年龄”:22日func: <函数hello (0 x00000179ef69c040>}
  tj
  <函数hello (0 x00000179ef69c040> 

<强> 5,多次序列化与反序列化

<1) json pre class="刷:py;">进口json   信息={   “name":“tj"   “age": 22   }      开放(f=皌est3.txt",“w")   f.write (json.dumps(信息))   信息(& # 39;年龄# 39;]=21   f.write (json.dumps(信息))   f.close ()   #   在在在   序列化两次后test3中的内容   test3。txt: {“name":“tj",“age": 22} {“name":“tj",“age": 21}      开放(f=皌est3.txt",“r")   #报错,py3以上,多次转储的文件反序列化报错,py2多次转储的文件也能被反序列化,先序列化的先被反序列化   data=https://www.yisu.com/zixun/json.loads (f.read ()) # json.decoder.JSONDecodeError   f.close ()   打印(数据)

2)泡菜

进口泡菜
  
  信息={
  “name":“tj"
  “age": 22
  }
  
  开放(f=皌est2.txt",“wb")
  f.write (pickle.dumps(信息))#等价于pickle.dump(信息,f)
  信息(“sex")=芭?
  f.write (pickle.dumps(信息))#等价于pickle.dump(信息,f)
  f.close ()
  
  在在在
  序列化两次后test2.txt中的内容
  test2。txt:, # 65533;及# 65533;},# 65533;(和# 65533;姓名攲tj攲年龄擪u。amp; # 65533;及# 65533;%},# 65533;(和# 65533;姓名攲tj攲年龄擪,# 65533;性攲濂硵u。
  
  开放(f=皌est2.txt",“rb")
  data=https://www.yisu.com/zixun/pickle.loads (f.read())第号一次反序列化正常
  #数据=pickle.loads (f.read()) #第二次反序列化:EOFError:跑出输入
  打印(数据)
  打印(数据(“年龄”))
  #打印(数据(“性”))# KeyError:“性”

Python中序列化与反序列化的区别有哪些