java中将字符串顺序反传转_如何在Java中将字符串序列化的Erlang术语反序列化为JInterface对象?...
我的接口系統(tǒng)提供了來自Erlang世界的結(jié)果,該結(jié)果發(fā)送了erlang術(shù)語的字符串表示形式,例如元組列表:
[ {"key1" , ["AAA","BBB"] } , {"key2" , ["CCC","DDD"] } ]
在Java中收到此字符串后,我想使用OTP庫(com.ericsson.otp.OtpErlangList等)對其進行解析(反序列化)。
我不想直接連接到Erlang OTP或在我的情況下使用Json或Xml(如果可能的話,請嘗試盡可能本機處理)。
當我將字符串轉(zhuǎn)換為OtpErlangList時,會得到一個整數(shù)列表,因此總的來說,我相信它會簡單地轉(zhuǎn)換為字符代碼,因為erlang中的字符串是代碼列表。看來JInterface中沒有反序列化器。如果是這種情況,那么我將不得不使用JSON。
由于OtpErlangObject(以及所有其他子類)具有toString方法,因此必須有一種方法。他們?yōu)槭裁床毁x予扭轉(zhuǎn)這種能力(fromString(String str))?
重申:如何從字符串直接將erlang術(shù)語字符串表示形式轉(zhuǎn)換為Java中的JInterface對象(無節(jié)點連接,與JSON接口等)。
歸功于這里的合作是最終答案:
最終的答案很簡單,據(jù)我所知,沒有針對Java(或其他語言)的erlang術(shù)語字符串表示反序列化器。但...
1)目前尚無Java接口(包括JInterface)支持從本地字符串術(shù)語表示形式反序列化erlang術(shù)語
2)Jinterface支持OtpInputStream,但是它期望使用Erlang外部術(shù)語格式,如此處所述
3)上面的外部術(shù)語格式是二進制數(shù)據(jù)。必須使用term_to_binary BIF將數(shù)據(jù)傳輸?shù)絁ava接口。
4)一旦數(shù)據(jù)流回到Java端的OtpErlangObject(使用JInterface),就可以向其內(nèi)部數(shù)據(jù)擴展,將OtpErlangObject轉(zhuǎn)換為發(fā)送的內(nèi)容(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
...
我不明白解析Erlang字符串比解析JSON更原生。但是,如果您確實想執(zhí)行此操作,則可以使用OtpInputStream類,并使用要解析的String的字節(jié)數(shù)組對其進行初始化。然后調(diào)用read_any以獲得OtpErlangObject。文檔在這里:OtpInputStream。
謝謝。 我實際上嘗試過在發(fā)布之前,OtpInputStream不起作用,因為它期望用于數(shù)據(jù)傳輸?shù)奶囟╡rlang格式不同于字符串表示形式。 我更新了顯示該示例的問題。 關(guān)于為什么我認為這是更原生的原因是,它需要花一些時間才能從erlang生成erlang字符串表示形式,并且構(gòu)造JInterface erlang對象也具有一個toString()方法,該方法很簡單。 在我看來,這比將其橋接到JSON或XML所需的計算更少。
僅僅為了完成我上面的評論,我感到困惑的是,所謂的erlang java接口(JInterface)沒有提供文本驅(qū)動的序列化方法(它將擴展到更大范圍的媒體傳輸和存儲)。 我相信erlang對象格式既強大又緊湊,就像JSON一樣。
JInterface不提供AFAIK這樣的功能。它旨在通過Erlang內(nèi)部網(wǎng)絡(luò)協(xié)議與Erlang節(jié)點進行通信。在您的情況下,我可能會編寫一個類似antlr的解析器。基于語法,您可以構(gòu)建任何喜歡的對象結(jié)構(gòu)。
您說的是盡可能原生的,沒有json等。但是如果您從Java調(diào)用erlang,我會使用協(xié)議緩沖區(qū)或節(jié)儉。也有伯特,但我還沒有嘗試過。我認為這些方法比處理字符串反序列化更安全,并且可以避免您頭疼的問題。
查看basho protobuf存儲庫,了解如何在Erlang中使用probbuff。
https://github.com/metadave/etp會將String轉(zhuǎn)換為Java對象模型(無節(jié)點連接,與JSON接口等)。以此為基礎(chǔ),只需在內(nèi)存表示中構(gòu)建JInterface模型即可。
The final answer is simply that there is no erlang term string representation deserializer
for Java (or other language) as far as I know.
這就是(上面的)etp項目。
總結(jié)
以上是生活随笔為你收集整理的java中将字符串顺序反传转_如何在Java中将字符串序列化的Erlang术语反序列化为JInterface对象?...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: aiepk.exe是什么进程 aiepk
- 下一篇: java美元兑换,(Java实现) 美元