[英]Java - Sending an object that points to a BufferedImage through a Socket
我和一群朋友正在研究Java項目,我們需要一些關於通過套接字發送對象的幫助。
到目前為止,我們已經實現了使用ObjectOutputStream
和ObjectInputStream
通過套接字發送簡單對象(整數,字符串和諸如此類)。 然而,我們今天遇到了一個巨大的問題(對我們來說很大,無論如何^^)
我們有一個樹形結構,我們需要從一台PC發送到另一台PC。 問題是,在該樹的每個節點內,我們都有對BufferedImage的引用,並且它不可序列化。
我們今天已經研究了很多,我們發現我們可以使用ImageIO.write()
通過套接字的OutputStream發送一個 BufferedImage,但是,這對我們沒有好處,因為我們不需要自己發送BufferedImage,但整個樹都在它的位置。
我們需要的是一種方法(如果它存在)序列化每個BufferedImage,在必要時將它轉換為另一個類,同時創建樹,並讓樹的每個節點引用新的可序列化類,因此樹可以作為整個對象......
我們真的不關心性能,因為我們發送的樹不是那么大(頂部10-15個節點)。 在此先感謝您的幫助,抱歉糟糕的英語。 哦,這是一個...好吧,一種功課,如果你想記住這一點:-)
謝謝!!
在每個節點上你可以使用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
}
}
您可以在客戶端將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());
}
}
}
如果要使用Objects Streams,可以將緩沖的圖像包裝在實現Serializable的類中,並且具有一個字節數組的屬性(圖像數據作為字節數組)。 您將不得不修改您的代碼,將BufferedImage引用更改為SerializableImage(類名示例)。
如果你這樣做,你的班級將被序列化並轉移..
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.