如何将数据从 Perl 传递到 Java?
Posted
技术标签:
【中文标题】如何将数据从 Perl 传递到 Java?【英文标题】:How can I pass data from Perl to Java? 【发布时间】:2009-03-04 16:41:54 【问题描述】:我正在处理一些 Java Perl 交互。我想知道将信息从 Perl 传递到 Java 的最佳方法是什么。 (关于 Perl 和 Java here 和 here 顺便说一句,答案很好)。
有很多文本和 XML(XML::Twig) 我在 Perl 中解析,在我应该从 Java Web 应用程序调用的脚本中。所以我收集了所有这些数据,我需要它在 Java 中的某些对象中使用它。
将信息从 Perl 发送到 Java 的最佳策略是什么?是否有可能从 Perl 向 Java 返回一个对象或其他兼容的数据结构?
我猜想写入一个文本文件并从 Java 中读取它会使使用 Perl 获得的所有优化变得毫无意义。
性能是这里的一个重要问题。
编辑: 从我所看到的here 来看,也许 Inline-Java 是一个不错的选择?
【问题讨论】:
那么你是不是想把你的旧java代码变成perl? 1.尝试 JSON 2。摆脱 perl,只使用 Java :) 我正在阅读该问题的帖子,建议使用 JSON,Inline-Java,打开 TCP 连接并传输数据,最后直接传递 XML。 * 建议的方法中哪一种更好? * 还有其他更好的选择吗,Web Services 或任何其他建议呢? 【参考方案1】:如果性能很重要,我建议运行持久的 Perl 进程。每次你想运行你的代码时启动一个 Perl 解释器将是一个相当大的开销。
最简单的通信方式是让 Java 进程打开与 Perl 进程的 TCP 连接,写入一些数据并取回一些数据。
您用于将数据从 Perl 进程发送回 Java 进程的格式取决于您发送的内容以及您希望代码的通用性和可重用性。发回 XML 字符串会很好而且通用,但是发回在 Perl 中使用 pack 创建的字节数组,然后在 Java 中使用 DataInputStream 读取会快得多。
【讨论】:
您实际上可以通过这种方式使用 Inline::Java。它可以创建一个与您的 Perl 进程通信的 jvm 进程。这是一种自定义格式或课程,但它让您可以在 Perl 中使用本机 Java 对象,反之亦然【参考方案2】:JSON 是一种用于传递数据的简单、轻量级的格式。
您可以添加 Rhino 或与您的工具包类似的东西,并可能获得额外的性能(更不用说脚本引擎),但这取决于您计划项目的复杂程度。
【讨论】:
【参考方案3】:如果您已经拥有 XML,最好的选择可能是继续使用它。
【讨论】:
我们的第一个实现让 Java 解析 XML,但我们发现 Perl 在这方面更快更有效。因此,我们正在尝试将这项工作派生给更擅长它的 Perl。 如果 Perl 解析 XML 的速度比 Java 快,你可能会做一些非常奇怪的事情。 我们使用 xPath 导航 XML 文件并获取节点值;但是,Perl 不是面向那种工作(文本解析和类似的东西)吗?? 我会忽略 Tom Hawtin 的想法,即 Java 将在 XML 解析方面击败 Perl。在解析文本方面,Perl 为王 - tbray.org/ongoing/When/200x/2007/10/30/WF-Results Perl 在解析 XML 时可能比 Java 更快的原因(我不确定)是 Perl 不解析 XML,它使用标准 C 库进行解析(expat 或 libxml2 ) 和访问这些库的模块。【参考方案4】:Inline::Java。一旦您启动并运行它,它就会非常有效。几年前,我在做一个项目,其中有一个 Perl Web 应用程序与 Java SOAP 服务器进行实时通信,但速度太慢了。我们将其替换为使用 Inline::Java 进行通信的系统,并且速度更快。绝对最小化你来回传递对象的点,并尝试使这些对象简单(我们坚持使用字符串、数字和数组)以防止事情变得过于失控。但我绝对是一个皈依者!
【讨论】:
【参考方案5】:我还觉得奇怪的是,您用于解析 XML 的 perl 代码比 java 中的等效代码要快得多。但是,即使是这样,我也无法想象它会比 IPC 产生的开销更快。即使您使用持久性 perl 进程,您仍然必须向它发送数据,大概是通过套接字,然后取回一些数据,最后将其反序列化为可用的东西。
您是否尝试过提高 Java 中 XML 解析的性能?如果您使用的是 DOM 或第三方库(如 JDOM 或 castor),请尝试使用 SAX。或者仅仅使用正则表达式而不是解析 XML 会更快(jwz notwithstanding).
无论如何,我建议先对您的 java 代码使用分析器,看看是否可以改进。
【讨论】:
有一个纯粹的perl XML解析库,但是没有一个关心速度的人使用它。大多数 perl XML 解析都涉及到 expat 或 libxml2,这很快。 我看不出这会有多大的不同。即使原始 XML 解析速度明显更快,您仍然需要 IPC 开销。以上是关于如何将数据从 Perl 传递到 Java?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 swig 将 const 字符串参数从 perl 传递到 c++