Java - 通过Socket发送指向BufferedImage的对象

时间:2011-11-07 00:19:03

标签: java sockets bufferedimage serializable

我和一群朋友正在研究Java项目,我们需要一些关于通过套接字发送对象的帮助。

到目前为止,我们已经实现了使用ObjectOutputStreamObjectInputStream通过套接字发送简单对象(整数,字符串和诸如此类)。然而,我们今天遇到了一个巨大的问题(对我们来说很大,无论如何^^)

我们有一个树形结构,我们需要从一台PC发送到另一台PC。问题是,在该树的每个节点内,我们都有一个BufferedImage的引用,并且它不可序列化。

我们今天一直在研究,我们发现我们可以使用ImageIO.write()通过套接字的OutputStream发送一个 BufferedImage,但是,因为我们不喜欢它们对我们不利不需要自己发送BufferedImage,但整个树都在它的位置。

我们需要的是一种方法(如果它存在)序列化每个BufferedImage,在必要时将它转换为另一个类,同时制作树,并让树的每个节点引用新的可序列化类,所以树可以作为整个对象发送......

我们真的不关心性能,因为我们发送的树不是那么大(顶部10-15个节点)。在此先感谢您的帮助,抱歉糟糕的英语。哦,这是一个......好吧,一种功课,如果你想记住这一点: - )

谢谢!

3 个答案:

答案 0 :(得分:4)

在每个节点上,您可以使用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
    }
}

答案 1 :(得分:3)

您可以在客户端将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());
    }
}
}

答案 2 :(得分:0)

如果要使用Objects Streams,可以将缓冲的图像包装在实现Serializable的类中,并且具有一个字节数组的属性(图像数据作为字节数组)。您将不得不修改您的代码,将BufferedImage引用更改为SerializableImage(类名示例)..

如果你这样做,你的班级将被序列化并转移..