Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > Переслать объект (экземпляр класса) на другую маш


Автор: Fieral 24.4.2008, 19:13
Вопрос такой - как организовать пересылку объектов на другой комп, для продолжения процесса обработки?

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

Автор: powerOn 24.4.2008, 19:35
Ну например с помощью RMI.

Автор: Maksym 27.4.2008, 11:25
Серилизировать/десериализировать, как вариант.

Автор: Fieral 30.4.2008, 15:11
Серилизировать/десериализировать насколько я понял, можно только серилизуемые/десериализуемые объекты. В чём тогда смысл этой операции?

Автор: Maksym 30.4.2008, 15:47
Цитата(Fieral @  30.4.2008,  14:11 Найти цитируемый пост)
Серилизировать/десериализировать насколько я понял, можно только серилизуемые/десериализуемые объекты. 

Да
Цитата(Fieral @  30.4.2008,  14:11 Найти цитируемый пост)
В чём тогда смысл этой операции? 

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

Автор: mbasil 30.4.2008, 21:03
На самом деле есть и более высокоуровневые технологии EJB и web службы.
Что использовать - это скорее вопрос задачи и проблемной  области. 
Web службы сериализуют (или точнее маршаллизируют) в XML. RMI сегодня это низкоуровневая технология. Сгодится скорее для одной задачи, для которой эффективность важнее повторного использования.

Автор: Maksym 30.4.2008, 22:28
mbasil
Согласись, давать в ответ на вопрос 
Цитата(Fieral @  24.4.2008,  18:13 Найти цитируемый пост)
Вопрос такой - как организовать пересылку объектов на другой комп, для продолжения процесса обработки?

EJB, Web Services и т.п. как-то противоречит принципу Оккама. Хотя ты прав в том что реализовать на этих технологиях будет по любому полезнее.

Автор: Fieral 1.5.2008, 03:12
Цитата(Maksym @ 30.4.2008,  15:47)
Цитата(Fieral @  30.4.2008,  14:11 Найти цитируемый пост)
Серилизировать/десериализировать насколько я понял, можно только серилизуемые/десериализуемые объекты. 

Да

А с остальными как быть?

Добавлено через 6 минут и 54 секунды
пакую объект в класс имплементирующий сереализацию
Код

class box implements Serializable{
            Object o=null;
            
            void put(Object o){
            this.o=o;    
            }
            Object get(){
                return this.o;
            }
        }    



копирую объект путём копирования этого класса
Код

box ob = null;
                    try {
                     ByteArrayOutputStream bos = new ByteArrayOutputStream() ;
                        ObjectOutputStream out = new ObjectOutputStream(bos);
                        out.writeObject(b);
                        out.close();
                        byte[] buf = bos.toByteArray();
                        byte[] buf2=buf.clone();
                        
                        ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(buf2));
                        try {
                            ob = (box)in.readObject();
                            in.close();
                        } catch (ClassNotFoundException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                        
                        
                        
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }

выдаёт:
java.io.NotSerializableException: java.awt.image.BufferedImage
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1156)
    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1509)
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1474)
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1392)
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1150)
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:326)

Автор: Maksym 1.5.2008, 12:00
Fieral
Если не сериализирумый класс правильно завернуть в наследника, который умеет сохранять его состояние, то инстансы этого наследника будут сериализируемыми. http://java.sun.com/j2se/1.5.0/docs/guide/serialization/examples/nonserialsuper/sources.html пример.
Кроме того ты можешь реализовать собственный механизм сериализации.

Я правильно понял, что ты изображение хочешь просчитывать и пересылать?

Автор: Fieral 1.5.2008, 12:04
Цитата(Maksym @  1.5.2008,  12:00 Найти цитируемый пост)
Я правильно понял, что ты изображение хочешь просчитывать и пересылать?


Ага. 
Но не только их - результаты обработки тоже забирать надо будет.

Автор: Maksym 1.5.2008, 12:44
Fieral
Ну в принципе тебе не обязательно пересылвать несериализируемый BufferedImage, достань из него байты картинки, отправь их, а там уже восстановиш в BufferedImage если он тебе будет нужен.

Автор: Fieral 1.5.2008, 14:48
Ну хорошо.
Тогда такой вопрос: допустим я буду пересылать что-нибудь ещё, отконвертированное в byte массивы. 
Как тогда на месте прибытия выяснять что именно приехало и в какой объект это конвертировать?

Автор: mbasil 2.5.2008, 12:22
Ну вот и возник вопрос о протоколе пересылки. Это ответ на замечание Maksym в мой адрес. Теперь надо "городить свой протокол или использовать более высокоуровневое решение. На шаг выше RMI.

Автор: Maksym 2.5.2008, 13:24
mbasil
Чтобы преслать пару объектов и массив байт не нужно городить какой-то сложный протокол. Пока что не вижу в этой задаче ничего такого, чтобы приплетать сюда тяжеленные энтерпрайз решения. Особенно если учесть, что организуются распределенные вычисления и, видимо, важна производительность.

Автор: mbasil 2.5.2008, 21:40
Согласен, что энтерпрайз решения может и не требуются. Написал я о них, поскольку некоторые разработчики пытаются решать задачи простыми методами, там где простые методы не подходят и приводят к появлению массы проблем.

При засылке разных объектов только массивом байт не обойдешься. Надо обернуть его в общий класс (сериализуемый), который помимо массива байт будет содержать дополнительную информацию о том, что на самом деле содержит массив. А это уже, как не верти хоть и простой но собственный протокол обмена. Если объектов может быть и не два, а больше, то RMI может оказаться предпочтительным. 

Автор: Maksym 2.5.2008, 23:38
mbasil
Ну вобщем мы пришли к консенсусу..  smile 

Автор: Fieral 11.5.2009, 16:56
Круто, спустя год я понял о чём они говорят.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)