Java中的python pickle.dumps和struct.pack
我正试图用来自Java应用程序的数据为carbon(Graphite)服务器提供数据。 我想使用pickle协议而不是one-line协议,因为它看起来要快得多 我已经在一个小的python脚本中完成了这项工作,该脚本调用了我的Java应用程序。但是我想用本机Java编写这个 python脚本如下所示:Java中的python pickle.dumps和struct.pack,java,python,pickle,Java,Python,Pickle,我正试图用来自Java应用程序的数据为carbon(Graphite)服务器提供数据。 我想使用pickle协议而不是one-line协议,因为它看起来要快得多 我已经在一个小的python脚本中完成了这项工作,该脚本调用了我的Java应用程序。但是我想用本机Java编写这个 python脚本如下所示: listOfMetricTuples = [('test', (1, 1352903620)), ('test', (2, 1352903620))] payload = pickle.dump
listOfMetricTuples = [('test', (1, 1352903620)), ('test', (2, 1352903620))]
payload = pickle.dumps(listOfMetricTuples)
header = struct.pack("!L", len(payload))
message = header + payload
如果不需要包含任何库,那就太好了
有人找到解决办法了吗?现在已经解决了
我使用Jython和下面的代码解决了这个问题
try{
Socket s = null;
try{
s = new Socket("debian-srv", 2004);
}catch(UnknownHostException e){
e.printStackTrace();
}catch(IOException e){
e.printStackTrace();
}
if (s == null) {
return -1;
}
PyTuple t = new PyTuple(new PyString("Test.brange-debian.mojo"), new PyTuple(new PyInteger(1352975858), new PyInteger(56)));
PyTuple t2 = new PyTuple(new PyString("Test.brange-debian.mojo"), new PyTuple(new PyInteger(1352975858-60), new PyInteger(43)));
PyTuple t3 = new PyTuple(new PyString("Test.brange-debian.mojo"), new PyTuple(new PyInteger(1352975858-2*+60), new PyInteger(65)));
PyList list = new PyList();
list.append(t);
list.append(t2);
list.append(t3);
PyString payload = cPickle.dumps(list);
byte[] bytes = ByteBuffer.allocate(4).putInt(payload.__len__()).array();
s.getOutputStream().write(bytes);
s.getOutputStream().write(payload.toBytes());
s.getOutputStream().flush();
s.close();
}
catch (Exception e) {
e.printStackTrace();
}
另一种选择,根据,可能是使用辉绿岩。占用的空间可能比使用Jython要小。pickle格式在Python之外并没有真正使用,而且有点复杂(据我所知,它需要编写一点字节码VM)。如果可能的话,我建议使用不同的格式(例如JSON)对数据进行编码。否则,找到一个已经实现了pickle格式的库可能比自己尝试更好。我无法更改服务器。所以我必须用泡菜。但我发现:我可能可以使用它。你应该做一些基准测试,看看这个小练习是否值得你花时间:)