如何将字符串序列化的Erlang术语反序列化为Java中的JInterface对象?

时间:2013-04-02 22:27:11

标签: erlang

我的界面系统提供了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连接等)。

5 个答案:

答案 0 :(得分:1)

你说尽可能是原生的,没有json等...但如果你从java调用erlang,我会使用protocol-buffersthrift。还有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项目(上图)。