Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的python pickle.dumps和struct.pack_Java_Python_Pickle - Fatal编程技术网

Java中的python pickle.dumps和struct.pack

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

我正试图用来自Java应用程序的数据为carbon(Graphite)服务器提供数据。 我想使用pickle协议而不是one-line协议,因为它看起来要快得多

我已经在一个小的python脚本中完成了这项工作,该脚本调用了我的Java应用程序。但是我想用本机Java编写这个

python脚本如下所示:

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格式的库可能比自己尝试更好。我无法更改服务器。所以我必须用泡菜。但我发现:我可能可以使用它。你应该做一些基准测试,看看这个小练习是否值得你花时间:)