在Android中读取python pickle数据流

Raj*_*ani 4 python android pickle

我有这个包含python pickle数据流的文件.我要在Android中阅读此文件的内容.

例如,如果我想在python中读取这个数据流,我只需使用以下代码

queue = pickle.load(open('filename', 'rb'))
Run Code Online (Sandbox Code Playgroud)

我想在Android中实现同样的功能,这样我就可以读取这个pickle流数据并将其存储在某种集合中.

我怎样才能做到这一点?

use*_*450 7

更新:这仅适用于泡菜协议2和3.

我认为Unpickler会从类地幔岩(MIT许可证)可能是您特别感兴趣的.它在技术上是Java,但Android基本上是Java.要解开,你会做类似以下的事情:

InputStream stream = new FileInputStream("filename");
Unpickler unpickler = new Unpickler();
Object data = unpickler.load(stream);
// And cast *data* to the appropriate type.
Run Code Online (Sandbox Code Playgroud)

随着进口:

import java.io.FileInputStream;
import java.io.InputStream;
import net.razorvine.pickle.Unpickler;
Run Code Online (Sandbox Code Playgroud)

这些是默认支持的对象:

PYTHON    ---->     JAVA
------              ----
None                null
bool                boolean
int                 int
long                long or BigInteger  (depending on size)
string              String
unicode             String
complex             net.razorvine.pickle.objects.ComplexNumber
datetime.date       java.util.Calendar
datetime.datetime   java.util.Calendar
datetime.time       java.util.Calendar
datetime.timedelta  net.razorvine.pickle.objects.TimeDelta
float               double   (float isn't used) 
array.array         array of appropriate primitive type (char, int, short, long, float, double)
list                java.util.List<Object>
tuple               Object[]
set                 java.util.Set
dict                java.util.Map
bytes               byte[]
bytearray           byte[]
decimal             BigDecimal    
custom class        Map<String, Object>  (dict with class attributes including its name in "__class__")
Run Code Online (Sandbox Code Playgroud)

还请注意:

unpickler只返回一个Object.因为Java是一种静态类型语言,所以必须将其转换为适当的类型.请参阅此表以了解您可以接收的内容.


更新:我跑了使用各种咸菜协议(测试0-3),并发现其失败的0和1,但成功的2和3.

这是用于生成pickle数据的python代码:

import pickle

class Data(object):
    def __init__(self):
        self.x = 12

data = Data()

for p in [0, 1, 2]:
    with open('data.{}'.format(p), 'wb') as fh:
        pickle.dump(data, fh, protocol=p)

# Python 3 only.
with open('data.3', 'wb') as fh:
    pickle.dump(data, fh, protocol=3)
Run Code Online (Sandbox Code Playgroud)

以及解开它的java代码:

import java.io.FileInputStream;
import java.io.InputStream;
import java.io.IOException;
import java.util.Map;
import net.razorvine.pickle.Unpickler;

public class Test {
    public static void main(String[] args) throws IOException {
        String filename = args[0];
        InputStream inputStream = new FileInputStream(filename);
        Unpickler unpickler = new Unpickler();
        Map<String, Object> data = (Map<String, Object>)unpickler.load(inputStream);
    }
}
Run Code Online (Sandbox Code Playgroud)

当使用data.0和运行时data.1,它失败了:

Exception in thread "main" net.razorvine.pickle.PickleException: expected zero arguments for construction of ClassDict (for copy_reg._reconstructor)
  at net.razorvine.pickle.objects.ClassDictConstructor.construct(ClassDictConstructor.java:23)
  at net.razorvine.pickle.Unpickler.load_reduce(Unpickler.java:617)
  at net.razorvine.pickle.Unpickler.dispatch(Unpickler.java:170)
  at net.razorvine.pickle.Unpickler.load(Unpickler.java:84)
  at Test.main(Test.java:13)
Run Code Online (Sandbox Code Playgroud)

当使用data.2和运行时data.3,它会成功.