【问题标题】:Java - Sending an object that points to a BufferedImage through a SocketJava - 通过套接字发送指向 BufferedImage 的对象
【发布时间】:2011-12-23 07:22:41
【问题描述】:

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

到目前为止,我们已经使用ObjectOutputStreamObjectInputStream 实现了通过套接字发送简单对象(整数、字符串等)。然而,我们今天遇到了一个大问题(对我们来说是个大问题,反正^^)

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

我们今天研究了很多,发现可以使用ImageIO.write()通过socket的OutputStream发送一个 BufferedImage,但是对我们没有好处,因为我们没有需要自己发送 BufferedImage,但它所在的整个树。

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

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

谢谢!!

【问题讨论】:

    标签: java sockets bufferedimage serializable


    【解决方案1】:

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

    【讨论】:

    • 好的,让我看看我是否明白这一点。根据您给我的链接的阅读,每次序列化协议“接触”节点时都会调用这些方法,从套接字读取它(它将调用 readObject)或写入套接字(它将调用写对象)。所以,我必须用这个方法将BufferedImage写入ObjectOutputStream“out”,然后通过调用其defaultWriteObject()方法的socket发送???如果我做对了请告诉我^^
    • 写入输出将通过套接字发送,最好先调用默认读/写,然后读取或写入 BufferedImage,您可以在底部查看docjar.com/html/api/java/util/HashMap.java.html 以获取真实示例用法
    • 工作就像一个魅力!非常感谢!!
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      如果你这样做,你的课程将被序列化和转移..

      【讨论】:

        猜你喜欢
        • 2015-08-31
        • 2014-01-11
        • 2021-01-11
        • 1970-01-01
        • 2012-08-29
        • 2023-04-03
        • 2013-02-05
        相关资源
        最近更新 更多