在Android中读取python pickle数据流
我有一个包含python pickle数据流的文件。我必须用Android阅读这个文件的内容 例如,如果我想用python读取这个数据流,我只需要使用以下代码在Android中读取python pickle数据流,android,python,pickle,Android,Python,Pickle,我有一个包含python pickle数据流的文件。我必须用Android阅读这个文件的内容 例如,如果我想用python读取这个数据流,我只需要使用以下代码 queue = pickle.load(open('filename', 'rb')) 我想在Android中实现同样的功能,这样我就可以读取这个pickle流数据并将其存储在某种集合中 如何实现这一点?更新:这仅适用于pickle协议2和3 我想你可能对麻省理工学院的课程特别感兴趣。从技术上讲,它是Java,但Android基本上是J
queue = pickle.load(open('filename', 'rb'))
我想在Android中实现同样的功能,这样我就可以读取这个pickle流数据并将其存储在某种集合中
如何实现这一点?更新:这仅适用于pickle协议
2
和3
我想你可能对麻省理工学院的课程特别感兴趣。从技术上讲,它是Java,但Android基本上是Java。要取消勾选,请执行类似以下操作:
InputStream stream = new FileInputStream("filename");
Unpickler unpickler = new Unpickler();
Object data = unpickler.load(stream);
// And cast *data* to the appropriate type.
关于进口:
import java.io.FileInputStream;
import java.io.InputStream;
import net.razorvine.pickle.Unpickler;
这些是默认情况下支持的对象:
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__")
以及取消勾选的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);
}
}
使用
data.2
和data.3
运行时,会成功。谢谢您的回复。这看起来很有希望。我的pickle数据流包含自定义类。所以,我像这样使用它objectdata=(Map)unpickler.load(inputStream)代码>这给了我一个错误net.razorvine.pickle.PickleException:构建ClassDict需要零个参数
。我做错什么了吗?@RajeshGolani看起来你需要在python端使用协议2
或3
进行pickle处理,这样它才能工作。有关更多详细信息,请参阅我的更新。
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);
}
}
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)