Raj*_*ani 4 python android pickle
我有这个包含python pickle数据流的文件.我要在Android中阅读此文件的内容.
例如,如果我想在python中读取这个数据流,我只需使用以下代码
queue = pickle.load(open('filename', 'rb'))
Run Code Online (Sandbox Code Playgroud)
我想在Android中实现同样的功能,这样我就可以读取这个pickle流数据并将其存储在某种集合中.
我怎样才能做到这一点?
更新:这仅适用于泡菜协议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,它会成功.
| 归档时间: |
|
| 查看次数: |
3945 次 |
| 最近记录: |