【问题标题】:How to deserialize an string-serialized Erlang term into a JInterface object in Java?如何将字符串序列化的 Erlang 术语反序列化为 Java 中的 JInterface 对象?
【发布时间】:2013-03-24 10:08:53
【问题描述】:

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

【问题讨论】:

    标签: erlang


    【解决方案1】:

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

    最后的答案很简单,就是没有 erlang term 字符串表示反序列化器 据我所知,适用于 Java(或其他语言)。

    这就是 etp 项目(上图)。

    【讨论】:

      【解决方案2】:

      这里的合作功劳是最终答案:

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

      1) 目前没有 Java 接口(包括 JInterface)支持从原生 string 术语表示形式反序列化 erlang 术语

      2) Jinterface 支持 OtpInputStream,但它需要 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
      ...
      

      【讨论】:

        【解决方案3】:

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

        【讨论】:

        • 谢谢。我实际上在发布之前尝试过,OtpInputStream 不起作用,因为它期望用于数据传输的特定 erlang 格式,这与字符串表示不同。我更新了显示该示例的问题。关于为什么我认为这更原生的原因是它需要快速计算才能从 erlang 生成 erlang 字符串表示,并且构造一个 JInterface erlang 对象也有一个直接的 toString() 方法。在我看来,与将其桥接到 JSON 或 XML 相比,这需要更少的计算。
        • 只是为了完成我上面的评论,我很困惑,声称的 erlang 的 java 接口(JInterface)不提供文本驱动的序列化方法(这将扩展到更广泛的媒体传输和贮存)。我相信 erlang 对象格式强大而紧凑,就像 JSON 一样。
        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

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

          【讨论】:

          • 查看basho protobuf 存储库,了解如何在 Erlang 中使用 protobuffs。
          猜你喜欢
          • 2018-11-01
          • 2022-11-15
          • 2020-10-19
          • 2020-02-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多