Как передать InputStream через RMI? - PullRequest
0 голосов
/ 28 января 2011

InputStream не сериализуется по умолчанию. Как передать InputStream через RMI для доступа к EJB?

Ответы [ 4 ]

3 голосов
/ 28 января 2011

Вы не можете. Представьте, что InputStream читает файл с диска, и вы отправляете его в качестве параметра метода в EJB, выполняющийся на JVM на другом компьютере. Этот дескриптор не может быть значимым при десериализации на другом компьютере.

Вы должны думать о основной проблеме, а не о механике. Вам нужно прочитать InputStream в сериализуемый объект (скажем, массив byte []) и передать его.

Если InputStream читает что-то, что слишком велико для памяти, то вам нужно обернуть это в объект Serializable, передать его, и этот объект может создать InputStream на другом конце (при условии, что, конечно, он может - иначе вы должны создать свой собственный поток, а это совсем другой вопрос).

3 голосов
/ 28 января 2011

Вы должны прочитать данные в байтовый массив, либо все в один массив, либо в несколько (зависит от размера читаемых данных), а затем передать эти байтовые массивы через RMI. InputStream, который не был прочитан, не является данными, которые могут быть переданы напрямую.

2 голосов
/ 29 января 2011

Это все равно что пытаться отправить телефон по телефонному проводу.Это не имеет смысла,

2 голосов
/ 28 января 2011

В своем ответе @Konstantin писал:

InputStream, который не был прочитан, не является данными, которые могут быть переданы напрямую.

Точно!

Например, что, по вашему мнению, произойдет, если вы попытаетесь сериализовать содержимое System.in для приложения, вызываемого как "java app </ usr / bin / yes"?(Подсказка: прочитайте «man yes») </p>

Если вы хотите «передать» поток через RMI, вы могли бы сделать это, создав класс-оболочку, который реализует Stream API и выполняет обратные вызовы RMI к исходномуПотоковый объект для чтения или записи данных.Вам нужно организовать так, чтобы в сериализованном состоянии обертки потока содержался дескриптор для выполнения обратных вызовов.

Однако для вашего клиента более разумно явно прочитать содержимое потока весь ,и передать его на сервер в виде байтового (или символьного) массива или буфера.

...