2013-04-02 58 views
2

我的界面系統提供了從二郎世界發送Erlang項,串reppresentation結果如元組的列表:如何在Java中將字符串序列化的Erlang術語反序列化爲JInterface對象?

[ {"key1" , ["AAA", "BBB"] } , {"key2" , ["CCC", "DDD"] } ] 

有一次,我收到此字符串在Java中,我想對它進行解析(反序列化)使用OTP庫(com.ericsson.otp.OtpErlangList等)。

我不想直接連接到Erlang OTP,或者在我的情況下使用Json或Xml(如果可能,儘量將其儘可能原生地處理)。

當我將字符串轉換爲OtpErlangList時,我得到一個整數列表,所以總體上我相信它只是轉換爲字符代碼,因爲erlang中的字符串是代碼列表。看起來JInterface中沒有反序列化器。如果是這種情況,那麼我不得不去JSON。

必須有一種方法,因爲OtpErlangObject(和所有其他的子類)有一個toString方法。他們爲什麼不能提供反轉的能力(fromString(String str))?

重申:如何在Erlang項字符串表示轉換成Java中JInterface對象直接從一個字符串(沒有節點連接,使用JSON等接口)。

回答

1

積分這裏的協作是最終的答案:

最終的答案很簡單,就是沒有爲Java(或其他語言)沒有Erlang項字符串表示解串器,據我所知。但是......

1)目前沒有Java接口(JInterface含)支持的Erlang項從本地字符串長期表現

2)Jinterface支持OtpInputStream反序列化,但它期望Erlang外部術語格式描述here

3)上述外部術語格式是二進制數據。數據傳輸到Java接口必須使用term_to_binary BIF來完成。

4)一旦數據被流回到一個OtpErlangObject在Java端(使用JInterface),可以朝向其內的數據擴展,鑄造OtpErlangObject到任何被髮送(OtpErlangList,OtpErlangTuple等)

二郎方:

ExternalFormatBinData = term_to_binary(MyTermToBeSent), 
%transmit data using messaging or other media 
... 

代碼的Java方面

OtpInputStream otpInputStream = new OtpInputStream(receivedBinaryDataArrayOfBytes) 
OtpErlangObject erlangObject = otpInputStream.read_any(); 
OtpErlangList erlangList = (OtpErlangList) erlangObject // replace OtpErlangList to whatever is being sent 
... 
1

你說的儘可能原生,沒有JSON等,但如果你從Java調用erlang,我會使用protocol-buffersthrift。也有bert,但我沒有嘗試過。我認爲這會比處理字符串/序列化更安全,併爲您節省頭疼。

+0

查看[basho protobuf](https://github.com/basho/erlang_protobuffs)存儲庫,以便與Erlang一起使用protobuffs。 – kjw0188

1

JInterface不提供這樣的功能AFAIK。它旨在通過Erlang內部網絡協議與Erlang節點進行通信。在你的情況下,我可能會寫一個類似antlr的解析器。基於語法,您可以構建您喜歡的任何對象結構。

1

我不明白如何解析Erlang字符串是比解析JSON更本機。但是,如果您確實想要這樣做,則可能可以使用OtpInputStream類,並使用您要解析的String的字節數組對其進行初始化。然後致電read_any以獲得OtpErlangObject。文檔在這裏:OtpInputStream

+0

謝謝。實際上,在本文發佈之前我曾試過,OtpInputStream不能正常工作,因爲它需要一種用於數據傳輸的特定erlang格式,這與字符串表示形式不同。我更新了顯示該例子的問題。關於爲什麼我相信這是更原生的原因是,它需要一個計算從Erlang生成erlang字符串表示形式,構建一個JInterface erlang對象也有一個toString()方法,這個方法很簡單。對我來說,這似乎需要的計算量少於將此橋接到JSON或XML。 – gextra

+0

爲了完成我上面的評論,我很困惑,一個如此聲稱的用於erlang(JInterface)的java接口沒有提供文本驅動的序列化方法(這將擴展到更廣泛的媒體傳輸和存儲)。我相信erlang對象格式是強壯而緊湊的,就像JSON一樣。 – gextra

0

https://github.com/metadave/etp將字符串轉換成Java對象MO del(沒有節點連接,與JSON接口等)。從內存表示中簡單地構建一個JInterface模型。

最終的答案很簡單,就是有解串器 爲Java(或其他語言)沒有Erlang項字符串表示,據我所知。

這就是etp項目(上圖)。

相關問題