Java - отправка объекта, который указывает на BufferedImage через сокет - PullRequest
0 голосов
/ 07 ноября 2011

Я и группа друзей работаем над проектом на Java, и нам нужна некоторая помощь по отправке объектов через сокеты.

До сих пор нам удалось отправить простые объекты (целые, строки и еще много чего)) через гнезда, используя ObjectOutputStream и ObjectInputStream.Однако сегодня мы столкнулись с огромной проблемой (для нас, в любом случае, огромной ^^)

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

Сегодня мы много исследовали и обнаружили, что можем использовать ImageIO.write() дляотправьте one BufferedImage через OutputStream сокета, однако для нас это бесполезно, поскольку нам не нужно отправлять BufferedImage отдельно, но все дерево, где бы оно ни находилось.

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

Мы действительно не заботимся о производительности, поскольку деревья, которые мы отправляем, не такие большие (10-15 узлов).Заранее спасибо за помощь, извините за паршивого английского.О, и это для ... ну, своего рода домашнее задание, если вы хотите иметь это в виду: -)

Спасибо !!

Ответы [ 3 ]

4 голосов
/ 07 ноября 2011

на каждом узле вы можете использовать writeObject () и readObject (), чтобы проверить http://java.sun.com/developer/technicalArticles/Programming/serialization/ для получения дополнительной информации

по сути это станет

public Node implements Serializable{

    transient BufferedImage buff;//transient make it so it won't be written with defaultWriteObject (which would error)

    private void writeObject(ObjectOutputStream out)throws IOException{
        out.defaultWriteObject();
        //write buff with imageIO to out
    }

    private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException{
        in.defaultReadObject();
        //read buff with imageIO from in
    }
}
3 голосов
/ 15 июня 2012

Вы можете преобразовать BufferedImage в байтовый массив на стороне клиента и затем отправить как обычный байтовый массив, а на стороне сервера создать BufferedImage из этого байтового массива. Ниже приведен код для преобразования BufferedImage в байтовый массив и наоборот.

import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import javax.imageio.ImageIO;

public class ImageTest {

public static void main(String[] args) {

    try {

        byte[] imageInByte;
        BufferedImage originalImage = ImageIO.read(new File(
                "c:/darksouls.jpg"));

        // convert BufferedImage to byte array
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ImageIO.write(originalImage, "jpg", baos);
        baos.flush();
        imageInByte = baos.toByteArray();
        baos.close();

        // convert byte array back to BufferedImage
        InputStream in = new ByteArrayInputStream(imageInByte);
        BufferedImage bImageFromConvert = ImageIO.read(in);

        ImageIO.write(bImageFromConvert, "jpg", new File(
                "c:/new-darksouls.jpg"));

    } catch (IOException e) {
        System.out.println(e.getMessage());
    }
}
}
0 голосов
/ 07 ноября 2011

Если вы хотите использовать Objects Streams, вы можете обернуть буферизованное изображение в класс, который реализует Serializable и имеет атрибут, который представляет собой массив байтов (данные изображения в виде байтового массива).Вам придется изменить свой код, изменив ссылки BufferedImage на SerializableImage (пример имени класса) ..

Если вы сделаете это, ваш класс будет сериализован и передан ..

...