2

我的接口系统提供了来自 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 接口等)。

4

5 回答 5

2

JInterface 不提供这样的功能 AFAIK。它旨在通过 Erlang 内部网络协议与 Erlang 节点进行通信。在您的情况下,我可能会编写一个带有antlr 之类的解析器。基于语法,您可以构建任何您喜欢的对象结构。

于 2013-04-04T06:23:11.607 回答
1

你说尽可能原生,没有json等。但如果你从java调用erlang,我会使用protocol-buffersthrift 。还有bert,但我没有尝试过。我认为这些比处理字符串反序列化/序列化更安全,并为您省去功能上的麻烦。

于 2013-04-03T14:35:55.033 回答
1

我不明白解析 Erlang 字符串比解析 JSON 更原生。但是,如果您真的想这样做,您也许可以使用OtpInputStream该类,并使用String您要解析的字节数组对其进行初始化。然后打电话read_any获取OtpErlangObject。文档在这里:OtpInputStream

于 2013-04-05T19:19:21.043 回答
1

此处合作的功劳是最终答案:

最终的答案很简单,据我所知,Java(或其他语言)没有 erlang 术语字符串表示反序列化器。但...

1) 目前没有支持从原生字符串术语表示反序列化 erlang 术语的 Java 接口(包括 JInterface)

2) Jinterface 支持 OtpInputStream,但它需要Erlang 外部术语格式,如此所述

3) 上述外部项格式为二进制数据。必须使用term_to_binary BIF 将数据传输到 Java 接口。

4) 一旦数据流回到 java 端的 OtpErlangObject(使用 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
...
于 2013-04-06T14:48:08.883 回答
0

https://github.com/metadave/etp将字符串转换为 Java 对象模型(无节点连接,与 JSON 接口等)。只需从内存表示中构建一个 JInterface 模型。

最终的答案很简单,据我所知,Java(或其他语言)没有 erlang 术语字符串表示反序列化器。

这就是 etp 项目(上图)。

于 2013-04-19T15:57:18.677 回答