我的接口系统提供了来自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接口等)。
归功于这里的合作是最终答案:
最终的答案很简单,据我所知,没有针对Java(或其他语言)的erlang术语字符串表示反序列化器。但...
1)目前尚无Java接口(包括JInterface)支持从本地字符串术语表示形式反序列化erlang术语
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
...
我不明白解析Erlang字符串比解析JSON更原生。但是,如果您确实想执行此操作,则可以使用OtpInputStream类,并使用要解析的String的字节数组对其进行初始化。然后调用read_any以获得OtpErlangObject。文档在这里:OtpInputStream。
谢谢。 我实际上尝试过在发布之前,OtpInputStream不起作用,因为它期望用于数据传输的特定erlang格式不同于字符串表示形式。 我更新了显示该示例的问题。 关于为什么我认为这是更原生的原因是,它需要花一些时间才能从erlang生成erlang字符串表示形式,并且构造JInterface erlang对象也具有一个toString()方法,该方法很简单。 在我看来,这比将其桥接到JSON或XML所需的计算更少。
仅仅为了完成我上面的评论,我感到困惑的是,所谓的erlang java接口(JInterface)没有提供文本驱动的序列化方法(它将扩展到更大范围的媒体传输和存储)。 我相信erlang对象格式既强大又紧凑,就像JSON一样。
JInterface不提供AFAIK这样的功能。它旨在通过Erlang内部网络协议与Erlang节点进行通信。在您的情况下,我可能会编写一个类似antlr的解析器。基于语法,您可以构建任何喜欢的对象结构。
您说的是尽可能原生的,没有json等。但是如果您从Java调用erlang,我会使用协议缓冲区或节俭。也有伯特,但我还没有尝试过。我认为这些方法比处理字符串反序列化更安全,并且可以避免您头疼的问题。
查看basho protobuf存储库,了解如何在Erlang中使用probbuff。
https://github.com/metadave/etp会将String转换为Java对象模型(无节点连接,与JSON接口等)。以此为基础,只需在内存表示中构建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项目。