从Redis读取Python Pickle数据并在Java中反序列化的方法?

之前的项目使用python 数据通过@shared_task(serializer="pickle")序列化到redis缓存中。现在由于一些问题 系统重构并使用java 那么如果不想丢弃原有的数据 那么java使用redis怎么解析之前存的数据 并存入相同的序列化格式?或者有其他思路?

询问ai 得出使用

   <dependency>
            <groupId>com.github.python-pickle</groupId>
            <artifactId>python-pickle</artifactId>
            <version>1.0.4</version>
        </dependency>

进行转换 但是中央仓库没有这个jar 各位经验丰富有什么好的想法吗

阅读 829
2 个回答

直接从java层面取序列化解析没找到解决办法 想到了另一个方案 python改用json序列化 并将原来的老数据全部批量重新转化json格式 这样java就可以解析了 目前这是一个可行的思路

pkl格式 我截图下image.png

新手上路,请多包涵
  1. 引入json模块
  2. redis中的键遍历,如果当前键对应的值不是json可以解析的,则用pickle反序列化后用json模块转成json存入当前键的值
import redis
import pickle
import json

r = redis.StrictRedis(host='localhost', port=6379, db=0)

for key in r.keys():
    try:
        # 获取键对应的值
        value = r.get(key)
        
        # 尝试解析为 JSON
        json.loads(value)
    except json.JSONDecodeError:
        try:
            # 如果不能解析为 JSON,则尝试使用 pickle 反序列化
            obj = pickle.loads(value)

            # 转换为 JSON 格式
            json_value = json.dumps(obj)
            
            # 存回 Redis
            r.set(key, json_value)
        except pickle.UnpicklingError:
            # 如果既不是 JSON 也不能用 pickle 反序列化,可能需要处理其他类型的数据
            # TODO: jpickle不能反序列化的处理,可以直接删除该键
            print(f"Key {key} has unsupported data format.")
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题