对pySerial连接进行pickle序列化

2 投票
1 回答
1060 浏览
提问于 2025-04-17 22:43

我正在做一个项目,想要在多个循环中使用同一个串口,但不想每次都打开和关闭它。因此,我想用pickle这个工具把串口对象写入一个文件,这样我就可以在任何需要的地方把它读出来,而不必每次都重新连接串口。

不过,我遇到了一些错误。以下是我的代码:

import sys
import serial
import pickle

ser = serial.Serial('/dev/tty1', 19200)
f = open('myfile.dat', 'wb+')
P = pickle.Pickler(f)
lineOCode = 'LOLOLOL'
P.dump(ser)

然后我收到错误信息,告诉我不能把串口对象进行pickle处理。(串口打开没问题,问题出在pickle这个功能上。)

结果是:

File "serial_pick.py", line 9, in <module>
P.dump(ser)
File "/usr/lib/python2.7/pickle.py", line 224, in dump
self.save(obj)
File "/usr/lib/python2.7/pickle.py", line 306, in save
rv = reduce(self.proto)
File "/usr/lib/python2.7/copy_reg.py", line 80, in _reduce_ex
dict = self.__dict__
TypeError: this __dict__ descriptor does not support 'Serial' objects

有什么建议吗?谢谢!

1 个回答

1

我觉得你不能对这样的对象进行序列化:

什么可以被序列化呢?

一般来说,只要这个对象的每个属性都可以被序列化,你就可以对它进行序列化。类、函数和方法是不能被序列化的——当你序列化一个对象时,实际上并没有把对象的类一起序列化,而只是保存了一个字符串,用来标识这个对象属于哪个类。这对于大多数情况来说是没问题的(不过要注意关于长期存储序列化数据的讨论)。

在序列化协议版本1中,你不能序列化打开的文件对象、网络连接或者数据库连接。想想看,这其实是有道理的——序列化无法保证在你反序列化对象时,文件对象的连接依然存在,而建立这种连接的过程超出了序列化能够自动处理的范围。如果你真的想序列化一个有问题属性的对象,可以查看序列化文档中的getstatesetstategetinitargs——使用这些方法,你可以排除掉那些有问题的属性。

在序列化协议版本2中,你可以序列化打开的文件对象。不过在未来的Python版本中,这个情况会有所改变。想了解更多信息,可以查看这个bug报告。

撰写回答