2012-11-14 36 views
1

我試圖用Java應用程序中的數據來提供碳(Graphite)服務器。 我想使用鹹菜協議,而不是oneline協議,因爲它似乎要快得多。Python中的pickle.dumps和struct.pack

我在一個從我的Java應用程序調用的小python腳本中完成了這項工作。但我想用原生Java寫這個。

的Python腳本是這樣的:

listOfMetricTuples = [('test', (1, 1352903620)), ('test', (2, 1352903620))] 
payload = pickle.dumps(listOfMetricTuples) 
header = struct.pack("!L", len(payload)) 
message = header + payload 

這將是巨大的,不需要包括任何庫。

任何人都有這個解決方案?

+2

pickle格式在Python之外並沒有真正使用,並且有些複雜(它包括編寫一個字節碼VM,據我瞭解)。如果可能,我建議使用不同的格式(例如JSON)來編碼數據。否則,最好找到一個已經實現了pickle格式的庫,而不是試圖自己做。 –

+0

我不能改變服務器。所以我必須使用pickle.dumps。但我發現這個:http://irmen.home.xs4all.nl/pyrolite/我可以使用。 – brange

回答

2

現在解決了。

我使用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(); 
} 
+0

你應該做一些基準,看看這個小小的鍛鍊是否值得你的時間:) –