You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 03:25:27