首页 > 其他分享 >序列化与反序列化

序列化与反序列化

时间:2023-01-16 22:23:49浏览次数:31  
标签:dump food dumps 对象 json 序列化

序列化与反序列化

  • 最近在读麦叔的“python3分钟”,麦叔花了4篇的篇幅来介绍序列化与反序列化,加之本来对序列化的理解就比较含糊,因此今天打算系统的把序列化与反序列化梳理一遍。

引言

  • 序列化:把对象转成字节数组的所制定的规则就叫序列化,或者说序列化只是一种拆装组装对象的规则,其实也就是转化成字符串,方便存储

  • 反序列化:从IO流里面读出数据的时候再以这种规则把对象还原回来就叫做反序列化

    • 对象序列化
      • 狭义:对象序列化是指把一些内存中的对象转变成字节流,以便保存到文件或者通过网络传输。等以后再通过反序列化转变成内存中的对象
      • 广义:把对象转换成JSON,CSV等数据格式也被称为序列化
  • 目的:

    • 便于对象可以跨平台存储,和进行网络传输
  • 常见的序列化方式:JDK(不支持跨语言)、JSON、XML、Hessian、Kryo(不支持跨语言)、Thrift、Protostuff、FST(不支持跨语言)

  • 应用场景

    • 把对象转换成JSON或XML格式,方便网络传输,通常是使用Rest API传输
    • 把对象转成字节流,方便远程方法调用(其实这种方法用的越来越少,因为大部分人会使用第一种方法中的API)
    • 把对象转换成字节流保存到硬盘,以便下次回来可以继续

python中的序列化的方式

  • Python中提供picklejson两个模块来实现序列化与反序列化,pickle模块和json模块dumps()、dump()、loads()、load()这是个函数,其中dumps()、dump()用于实现序列化,loads()、load()用于实现反序列化

  • pickle和json的区别

    • json 所有语言通用;只能序列化基本内容,输出的类型为字符型
    • pickle对于python中的所有东西均能被序列化(socket对象除外)序列化的内容只有python认识,缺点:不可读,pickle输出的字符类型为types

pickle序列化

  • pickle是Python自带库,可以把对象转成字节流

  • pickle模块的dumps()、dump()、loads()、load()是个函数按功能划分可以分为两组:

      序列化:dumps()、dump()

      反序列化:loads()、load()

  • dumps()与dump()的区别是dumps()只是单纯得将对象序列化,而dump()会在序列化之后将结果写入到文件当中;与之对应,loads()与load()区别至于loads()是对dumps的序列化结果进行反序列化,而dump()会从文件中读取内容进行反序列化。

#********************************>>>>>dumps()/loads()<<<<<*******************************
#利用pickle模块对集合进行序列化与反序列化
v = {1,2,3,3}
import pickle
val = pickle.dumps(v)
print (val)
data = pickle.loads(val)
print(data)

#元组作为一个元素同样是可行的
v = (1,2,3,3,[1,2,3])
import pickle
val = pickle.dumps(v)
print (val)
data = pickle.loads(val)
print(data)

#利用pickle对函数进行序列化与反序列化
def func():
    print("yang")
import pickle
v1 = pickle.dumps(func)
v2 = pickle.loads(v1)
print(v1,v2,sep = "\n") #sep:同时打印两个对象时进行换行

#********************************>>>>>dump()/load()<<<<<*******************************

class Food:
  def __init__(self, name, origin, calories, price):
    self.name = name
    self.origin = origin #产地
    self.calories = calories #卡路里
    self.price = price

print('...此处省略2500行推荐算法代码...')
food1 = Food('胡辣汤', '山东', 25, 2)
food2 = Food('油条', '山东', 88, 1)
food3 = Food('豆腐脑', '山东', 35, 2.5)
food4 = Food('焖饼', '山东', 65, 10)

recommend = [food1, food2, food3, food4]

import pickle
with open("foods.pickle", "wb") as file:#打开一个新文件file,由于是字节流,必须是wb,模式的
    pickle.dump(recommend, file)

#进行反序列化
with open("foods.pickle", "rb") as out:
    remote_recommend = pickle.load(out)
print(remote_recommend)

json序列化

  • json序列化之后得到的是json格式字符串JSON就这样通过大括号、方括号、键值对以及对象的嵌套,可以表达几乎任何复杂的数据
  • json序列化指的是,将python数据类型转化为json类型,不支持元组和*集合8进行序列化
#将对象序列化dumps
food = [
   {'name':'jame', 'origin':'Italy'},
   {'name':'hamburger', 'origin':'UK'},
]

import json
# 把对象转成JSON字符串
food_json = json.dumps(food)
print(f'检查一下food_json的类型,是字符串:{type(food_json)}')
print('打印一下结果:')
print(food_json)

# 把JSON字符串转成对象
from_json = json.loads(food_json)
print(f'看一下类型,应该是列表:{type(from_json)}')



#当要序列化的对象中含有中文字符时,json.dumps()序列化时便不会解码,出现乱码
food = [
   {'name':'样子', 'origin':'Italy'},
   {'name':'hamburger', 'origin':'UK'},
]
import json
# 把对象转成JSON字符串
food_json = json.dumps(food)
print(food_json)
'''
[{"name": "\u6837\u5b50", "origin": "Italy"}, {"name": "hamburger", "origin": "UK"}]
'''
#此时应该在dump添加参数ensure_ascii=False
json.dumps(food, ensure_ascii=False)


#json不支持*元组*和*集合进行序列化
v1 = [11,'yang',[11,22,33],{'k':5},True,("yang","zi")]
#当对象中含有元组时在序列化的时候会将其自动变为列表,当含有集合的时候就会报错
import json
v2 = json.dumps(v1)
print(v2,type(v2))
'''
输出结果
[11, "yang", [11, 22, 33], {"k": 5}, true, ["yang", "zi"]] <class 'str'>
'''


#*****************************************json.dump/loads**************************************************
#序列化后并写入一个指定的文件,

f = open('x.txt',mode='w',encoding ="utf-8")
v = ('杨子列','杨驰',[1,2,3])
import json
val = json.dump(v,f)
print(val)

f = open('x.txt',mode='r',encoding ="utf-8")
import json
val = json.load(f)
f.close()
print(val)


就在如何将python中的对象或者方法利用json直接进行序列化的情况,麦叔在三分钟的25—28处给出了较为详细的方法,随着学习的深入要回过头来再补充.........

标签:dump,food,dumps,对象,json,序列化
From: https://www.cnblogs.com/yangzilaing/p/17056426.html

相关文章

  • django获取多对多关系表中字段返回以及序列化器中传参解决方案
    djangohowcanimakeaserializerwithrelationtablefieldhttps://stackoverflow.com/questions/53137077/django-rest-framework-serializer-with-field-from-rela......
  • RMI和JNDI反序列化知识点回顾
    RMI介绍RMI(RemoteMethodInvocation)远程方法调用,就是可以使远程函数调用本地函数一样方便,因此这种设计很容易和RPC(RemoteProcedureCalls)搞混。区别就在于RMI是Ja......
  • FlinkCDC的自定义反序列化
    FlinkCDC的自定义反序列化FlinkCDC的简单使用方法packagecom.pzb;importcom.ververica.cdc.connectors.mysql.MySqlSource;importcom.ververica.cdc.connectors.my......
  • C++ 序列化和反序列化
    序列化1、背景1、在TCP的连接上,它传输数据的基本形式就是二进制流,也就是一段一段的1和0。2、在一般编程语言或者网络框架提供的API中,传输数据的基本形式是字节,也就是Byte......
  • 序列化与反序列化
    O:4:"site":3:{s:3:"url";s:13:"www.baidu.com";s:4:"name";N;s:5:"title";s:4:"test";}//析构函数:结束运行结束后会调用此魔术方法//__tostring:当我们直接要输出......
  • 【BFS】LeetCode 297. 二叉树的序列化与反序列化
    题目链接297.二叉树的序列化与反序列化思路代码classCodec{//Encodesatreetoasinglestring.publicStringserialize(TreeNoderoot){i......
  • Django序列化器的简单使用
    [Django序列化器的简单使用-SSgeek-博客园](https://www.cnblogs.com/ssgeek/p/13263810.html)注意:serializer 不是只能为数据库模型类定义,也可以为非数据库模型类的......
  • JavaScript 中URL 查询字符串(query string)的序列与反序列化
    方法一:在JavaScript中,可以使用URLSearchParams对象来处理URL中的查询字符串。序列化(将JavaScript对象转换为查询字符串)可以使用URLSearchParams对象的append(......
  • java反序列化从0到cc1
    前言java安全已成为安全从业者必不可少的技能,而反序列化又是Java安全非常重要的一环。又是本文将从0基础开始,带着大家层层递进,从java基础到URLDNS链到最终理解反序列化cc1......
  • MessagePack, Protocol Buffers和Thrift序列化框架原理和比较说明
    ​第1部分 messagepack说明1.1messagepack的消息编码说明为什么messagepack比json序列化使用的字节流更少, 可通过图1-1、图1-2有个直观的感觉。  图1- 1与json的格式对......