2011-01-28 69 views
0

缺省情况下,InputStream未被序列化。如何通过RMI传递InputStream来访问EJB?如何通过RMI传递InputStream?

+0

可能重复的[如何发送inputStream对象到Java EJBean?](http://stackoverflow.com/questions/1862914/how-to-send-an-inputstream-object-到Java-EJBean中) – Thilo 2011-01-28 05:15:10

回答

3

您必须将数据读入字节数组,或者将数据全部写入一个数组,或者写入多个数据(取决于正在读取的数据的大小),然后将这些字节数组传递给RMI。尚未读取的InputStream不是可以直接传递的数据。

3

你不能。想象一下,InputStream从磁盘读取文件,然后将其作为方法参数发送给另一台机器上的JVM上执行的EJB。在另一台机器上反序列化时,没有办法使InputStream有意义。

你需要考虑潜在的问题而不是机制。你需要将InputStream读入一个可序列化的对象(比如一个byte []数组)并传递它。

如果InputStream读取的内容太大,则需要将其包装在一个Serializable对象中,传递该对象,并让该Object能够在另一端创建InputStream(假设它可以)当然 - 否则你必须创建自己的流,这是一个完整的其他问题)。

2

在他的回答@Konstantin写道:

一个尚未阅读的InputStream是不是可以直接传递数据。

准确!

例如,如果您尝试为调用为“java app </usr/bin/yes”的应用程序序列化System.in的内容,您会发生什么? (提示:读取“man yes”)

如果要跨RMI“传递”流,可以通过创建实现Stream API的包装类来实现,并对原始流对象执行RMI回调读取或写入数据。您需要安排流封装的序列化状态包含一个执行回调的句柄。

但是,您的客户端显式读取整个流内容并将其作为字节(或字符)数组或缓冲区传递到服务器会更明智。

2

这就像试图通过电话线发送电话。它没有任何意义,