美文网首页程序员
Java 解析 python使用 pickle序列化后的数据

Java 解析 python使用 pickle序列化后的数据

作者: Lc_fly | 来源:发表于2018-10-31 23:54 被阅读0次

换了新公司,一切也重新开始,接触到的第一个活就是可能需要将之前python写的一套数据传输的代码,改用Java实现,提高开发效率;

整个业务分为两部分:

  1. 抽取接口数据,pickle序列化后打包上传到云服务器;
  2. 从云服务器下载,解析入库;

我主要做的是先将解析入库这部分Java化,其中一个很大的问题就是解析pickle序列化后的数据,这个问题折磨我了2天。。

主要是好像这种问题网上很少解决方案,也不知道是不是我这操作太奇葩了。。度娘就别想了,只能借助梯子了。看过网上的示例都没有能正常跑的,或多或少都有些问题,不过也让我了解到了目前的解决方案,也主要分为两种:

  1. 借助Jython来做,引入jar包后,可以在Java里使用python的代码,当然这应该是对应的Java实现吧,但是感觉有点重,jar包有30多M

  2. 使用pyrolite包,这个包主要是用于与python通信,进行远程调用python的方法;

    因为我们数据打包上传跟下载解析是分开部署的, 如果在解析那块还去单独部署个python用来解析数据,再用Java去远程调用去获取返回值,这就有点多此一举了。。所以我们这边使用的就是通过引入Jython来实现了,到时候数据打包如果也改成Java实现的话,那就再改造了。

先说说遇到的几个坑吧:

init: Bootstrapping class not in BootstrapTypesSingleton.getClassToType()[class=class org.python.core.PyBaseString]

解决这个问题花的时间最久,不解决的话使用pystring的时候会报空指针错误;之前从网上看到过类似的,需要在使用前先执行.gcMonitorGlobal方法,但是由于个人粗心。跑去调用pystring.gcMonitorGlobal,所以并没有卵用,最后仔细看错误发现是PyBaseString的问题,而PyString又是继承PyBaseString的,后来在代码中加入静态块解决该问题;

ValueError: insecure string pickle

不安全的值,原因是也是格式问题,python序列化后的格式是这样的


然后读取时,在每行尾部需要加上"\n"换行才可以

至此遇到的大问题都已经解决,其他问题的话就比较常见了(比如格式转换异常这种),主要是也没有搜到什么完整的解决方案,也是自己东拼西凑才搞定的,也是不容易,还是因为对python也不太了解吧,遇到没见过的报错有点懵,而且有时候报的错也不一定是真实的错。例如ValueError这个错,最开始报的是空指针,通过调试代码看,是Jython里的异常类toString的时候空指针,导致无法发现真实的错误,只能一步步调试,才发现。。有点坑

因为确实搜索过没有发现什么完整的解决方案或代码示例,所以整理出来希望能帮到大家!

参考网站:
http://bugs.jython.org/issue2492
https://github.com/irmen/Pyrolite
https://nikoskatsanos.com/blog/2017/01/08/python-unpickling-in-java/
http://www.roman10.net/2012/10/10/loading-python-pickle-files-from-java/

相关文章

  • Python3 pickle模块的使用详解

    pickle 模块 序列化 pickle模块特点 1、只能在python中使用,只支持python的基本数据类型。...

  • Java 解析 python使用 pickle序列化后的数据

    换了新公司,一切也重新开始,接触到的第一个活就是可能需要将之前python写的一套数据传输的代码,改用Java实现...

  • 序列化

    在 Python 中 pickle 模块实现对数据的序列化和反序列化。pickle 支持任何数据类型,包括内置数据...

  • Python保存工作空间的数据(pickle your data

    [toc] 通用方法 pickle python的pickle模块实现了基本的数据序列和反序列化。通过pickle...

  • 文件操作

    打开、读/写文件 pickle python的pickle模块实现了基本的数据序列和反序列化。通过pickle模块...

  • python学习笔记--pickle模块

    Python的pickle模块实现了基本的数据序列和反序列化。通过pickle模块的序列化操作我们能够将程序中运行...

  • 2018-02-07

    python pickle模块:python变量及对象的序列化 1、pickle.dump 将python变量...

  • python模块 | pickle:python对象序列化

    一 什么是pickle pickle实现了用于python对象结构的序列化和去序列化的协议; 会把python转成...

  • Python pickle的使用

    pickle简介 pickle模块是对Python对象结构进行二进制序列化和反序列化的协议实现,就是把Python...

  • python-pickle

    pickle模块是对Python对象结构进行二进制序列化和反序列化的协议实现,就是把Python数据变成流的形式。...

网友评论

    本文标题:Java 解析 python使用 pickle序列化后的数据

    本文链接:https://www.haomeiwen.com/subject/sazztqtx.html