Skip to content

Latest commit

 

History

History
301 lines (212 loc) · 7.23 KB

427-190651-[专业选修]序列化_serialize.sy.md

File metadata and controls

301 lines (212 loc) · 7.23 KB
show version enable_checker
step
1.0
true

序列化

回忆

  • 上次我们研究追加文件
    • 追加文件就是把文件打开
    • 然后在后面写上要写的内容
  • 还有读写功能+
    • 这可以让我们既可以读又可以写
  • 我还想让程序写点复杂的程序
    • 从文件读取信息
  • 可以么?🤔

写文件

图片描述

  • 往文本里面写了两个东西
    • 人名: "oeasy"
    • 工作时间 "12"
    • 这两个都是文本型的
  • 用"\n"分隔开

读文件

图片描述

  • 可以进行读写操作
  • 如果我想把工作时间修改为 byte 型的数字变量呢?
  • 数字形式的变量还可以保存成txt文件么?

txt格式

  • txt格式一般存储的是文本text

图片描述

  • 这和织物有什么关系

织物

  • 以前的人看到密密麻麻的文字很像织物(texture)
  • 人类社会先有织物后有密密麻麻排布好的文字
  • 所以起了text这么名字

图片描述

  • 我们如果直接用二进制方式写字节型的数字
  • 就肯定不是纯文本了
  • 为了避免误会
  • 把扩展名txt取消

写文件

  • 我们打开一个新文件(oeasy)
    • 不是刚才的oeasy.txt
    • 先写字符串信息
    • 用的是默认的"w"
      • 相当于"wt"
      • 文本模式

图片描述

  • 注意一定要有个\n作为分隔符
  • 追加写文件

追加

  • 然后就是追加写二进制字节数字
    • 用的模式是ab
      • a append 追加
      • b binary 二进制

图片描述

  • 注意使用追加二进制写模式
    • f = open("oeasy","ab")
  • 确实在文本型的名字后面追加了一个字节
    • b_num = struct.pack("b",5)
    • 字节型整数
    • 数值为5

序列化

  • 这个过程其实是一个序列化
    • 或者叫做串行(xíng)化 (Serialize)
    • 就像一系列的序列号一样
    • 是有顺序存储的字节序列

图片描述

  • 我们可以把我们的数据内容
    • 按照字节流的方式
    • 存储于各个地方
    • 这就是序列化 Serialize
  • 然后可以再读取字节流
    • 转化为我们的数据内容
    • 这就是反序列化
    • 或者说反串行化
    • deserialize

读取文件

vi oeasy

图片描述

  • :%!xxd
    • 转化为2进制

图片描述

  • :%!xxd -r

    • 转化回去
  • 然后我们去文件读取

先读名字

  • 先读出名字
  • 用的是默认的 rt 模式
  • 读文本

图片描述

再读时长

  • 然后是读出工作时长
    • 用的是指定的 rb 模式
    • 读二进制

图片描述

  • 如果除了名字和工作时长之外
    • 还需要读写每小时工资呢?
    • 每小时工资是一个 double 型的变量

写数据

  • 这次我们再打开一个新文件(oeasyd)
    • 之前读写的文件是(oeasy)
  • 还是先往新文件(oeasyd)里面写人名(oeasy)
    • 使用的模式是默认的"w"
      • 也就是"wt"

图片描述

  • 再写工作时长

图片描述

  • 最后写单位时间工资

图片描述

  • 尝试把他读出来

读取数据

图片描述

  • 尝试 readline
  • 但是失败了
  • 因为这次写的模式是
    • 先wt写名字
    • 再ab方式写数字
  • 写完名字(oeasy)之后没有添加line的结束标记\n
    • 而且用的是"rt"模式
    • 所以读到了后面一些字节
    • 而这些字节无法转化为utf-8的文本
    • 这个0x9a怎么来的呢?

图片描述

  • 第3个字节就是0x9a
  • 0x91之前还没有换行符分不开
  • 这次别忘了\n分隔符
  • 重新写

重写

  • 别忘了\n

图片描述

  • 然后把两个数字型的变量写进去

图片描述

  • 成功了
  • 名字、工作时长、每小时工资这三个数据分别写了进去
    • 构成了一个序列 serial
  • 这种写文件的过程就是序列化
    • 复杂的字处理、电子表格、图像、3d 工程
    • 也是按照他们自身定义的序列方式写进文件
    • 然后读出来的
  • 我们来试试读出来

读取文本

图片描述

  • 见上图
    • 先用默认的 rb 模式读出名字
    • 因为rt模式 有时会影响到readline读不出来
    • 并关闭文件
  • 然后去找到后面的数字位置

读取1个字节型整数

  • 名字之后有两个数字
    • 1 个字节 的 整型数字
    • 8 个字节 的 双精度浮点型数字
    • 总共 9 个字节

图片描述

  • 这次使用rb方式打开文件
    • 见上图
    • 先找到读取位置
    • seek(-9,2)
      • 找到从结尾往前 9 个字节的位置
      • 9个字节 来自于 之前提到的 1 + 8
    • 先读字节型整数

读取8个字节的双精度浮点型数字

  • 最后去读取 8 字节的双精度浮点数
    • 读取最后的八个字节
    • 见上图

图片描述

  • 总共没几个字节
    • 还要读 3 次
    • 太费劲了
    • 并且落实到py文件

serialize单词

  • 这个单词来自于serial序列
    • serial tv系列电视剧
    • serial number 序列号
    • serial podcast 系列广播

图片描述

  • serial dilution 梯度稀释

    • 按梯度稀释
    • 一步步来
  • usb

    • Universal Serial Bus
    • 通用串行总线
    • 信号是按照序列进行传递的

serialize

  • 序列化
    • 将一个对象转化成字节流的形式
    • 方便存储和传输

图片描述

反序列化

  • 反序列化是将字节流
    • 转化为对象

图片描述

  • 序列化和反序列化
    • 就是在将字节流和对象相互转化
    • 完成传输和存储
    • 字节序列是按照文件格式排列的

总结

  • 这次我们研究数据序列化
    • 字符串
    • 字节型整数
    • 双精度浮点数
  • 依次写入
    • 然后可以进行数据类型转化
    • 并且进行运算
  • 可以对于序列化
    • 定点写入
    • 定点读取
  • 这并不难
    • 我们可以按照需求对文件进行读写操作么?🤔
  • 下次再说 👋