Python:如何将已初始化对象序列化/反序列化为字符串?
Python 对象序列化与反序列化(保存为字符串并恢复)
要实现把已初始化的对象转成字符串、再从字符串直接恢复对象的需求,Python里有几种实用方案:
1. 使用 pickle 模块(原生支持,适合Python内部场景)
pickle 是Python自带的序列化工具,能直接把对象序列化为字节流,搭配base64编码可转成安全存储的字符串。
示例代码:
import pickle import base64 # 模拟你提到的初始化函数 def default_function(a, b, c): class Obj: def __init__(self, x, y, z): self.x = x self.y = y self.z = z def __repr__(self): return f"Obj(x={self.x}, y={self.y}, z={self.z})" return Obj(a, b, c) def a_function(a, b, c): obj = default_function(a, b, c) obj.type = "A" return obj def b_function(a, b, c): obj = default_function(a, b, c) obj.type = "B" return obj # 初始化对象 a = True b = False obj = default_function(1, 2, 3) if a: obj = a_function(1, 2, 3) elif b: obj = b_function(1, 2, 3) # 保存为字符串 obj_bytes = pickle.dumps(obj) obj_as_str = base64.b64encode(obj_bytes).decode('utf-8') # 从字符串恢复对象 restored_bytes = base64.b64decode(obj_as_str) restored_obj = pickle.loads(restored_bytes) print(restored_obj) # 输出: Obj(x=1, y=2, z=3) type='A'
注意:
pickle仅适合Python环境内部使用,无法跨语言解析,且加载未知来源的pickle数据存在安全风险。- 用base64编码是为了避免二进制字节流出现乱码,确保字符串可稳定存储或传输。
2. 使用 json 模块(通用跨语言,适合简单对象)
如果是自定义类对象,可手动将对象转成字典后序列化JSON,恢复时反向操作即可。
示例代码:
import json # 自定义类 class CustomObj: def __init__(self, x, y, z, type=None): self.x = x self.y = y self.z = z self.type = type def __repr__(self): return f"CustomObj(x={self.x}, y={self.y}, z={self.z}, type={self.type})" # 模拟初始化函数 def default_function(a, b, c): return CustomObj(a, b, c) def a_function(a, b, c): return CustomObj(a, b, c, "A") def b_function(a, b, c): return CustomObj(a, b, c, "B") # 初始化对象 a = True b = False obj = default_function(1, 2, 3) if a: obj = a_function(1, 2, 3) elif b: obj = b_function(1, 2, 3) # 转字典后序列化JSON obj_as_str = json.dumps(obj.__dict__) # 从JSON恢复对象 restored_dict = json.loads(obj_as_str) restored_obj = CustomObj(None, None, None) restored_obj.__dict__.update(restored_dict) print(restored_obj) # 输出: CustomObj(x=1, y=2, z=3, type=A)
注意:
- JSON方案通用性强,可跨语言解析,但需要手动处理自定义类的序列化逻辑,复杂对象(如包含lambda、datetime)处理起来较繁琐。
3. 使用 dill 模块(增强版pickle,支持复杂对象)
dill 是第三方库,比pickle支持更多Python对象类型(比如lambda函数、嵌套类),用法和pickle类似。
先安装依赖:
pip install dill
示例代码:
import dill import base64 # 模拟包含lambda的初始化函数 def default_function(a, b, c): obj = type('Obj', (object,), { 'x': a, 'y': b, 'z': c, 'calc_sum': lambda self: self.x + self.y + self.z })() return obj # 初始化对象 obj = default_function(1, 2, 3) # 保存为字符串 obj_bytes = dill.dumps(obj) obj_as_str = base64.b64encode(obj_bytes).decode('utf-8') # 恢复对象 restored_bytes = base64.b64decode(obj_as_str) restored_obj = dill.loads(restored_bytes) print(restored_obj.x) # 输出: 1 print(restored_obj.calc_sum()) # 输出: 6
注意:
dill仍为Python专属,需安装第三方库,适合处理pickle无法序列化的复杂对象。
内容的提问来源于stack exchange,提问作者Mr. B.
相关产品推荐
相关产品推荐

