我的界面系统提供了Erlang世界的结果,发送了一个erlang术语的字符串表示,例如元组列表:
[ {"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连接等)。
答案 0 :(得分:1)
你说尽可能是原生的,没有json等...但如果你从java调用erlang,我会使用protocol-buffers或thrift。还有bert但我没有尝试过它。我认为这些比处理字符串序列化更安全,并且可以避免功能上的麻烦。
答案 1 :(得分:1)
JInterface不提供此类功能AFAIK。它旨在通过Erlang内部网络协议与Erlang节点进行通信。在你的情况下,我可能会编写一个类似antlr的解析器。基于语法,您可以构建任何您喜欢的对象结构。
答案 2 :(得分:1)
我不明白如何解析Erlang字符串比解析JSON更原生。但是,如果您真的想这样做,您可以使用OtpInputStream
类,并使用要解析的String
的字节数组对其进行初始化。然后致电read_any
以获得OtpErlangObject
。文档在这里:OtpInputStream。
答案 3 :(得分:1)
此处对合作的肯定是最终答案:
最后的答案很简单,就我所知,没有针对Java(或其他语言)的erlang术语字符串表示反序列化器。但...
1)目前没有Java接口(包括JInterface)支持从本机字符串术语表示中反序列化erlang术语
2)Jinterface支持OtpInputStream,但它需要{strong> Erlang外部术语格式,如here所述
3)上述外部术语格式是二进制数据。必须使用term_to_binary BIF将数据传输到Java接口。
4)一旦数据流回到java端的OtpErlangObject(使用JInterface),它就可以向其内部数据扩展,将OtpErlangObject转换为发送的内容(OtpErlangList,OtpErlangTuple等)
Erlang方面:
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
...
答案 4 :(得分:0)
https://github.com/metadave/etp会将String转换为Java对象模型(没有节点连接,与JSON连接等)。只需从内存表示中构建一个JInterface模型。
最后的答案很简单,就是没有erlang术语字符串表示反序列化器 对于Java(或其他语言),据我所知。
这就是etp项目(上图)。