如何序列化包含图像的对象?

时间:2015-10-27 22:38:06

标签: java serialization objectoutputstream

我如何使用Image发送对象?我收到了这个错误:

java.io.NotSerializableException: org.eclipse.swt.graphics.Image 

我可以发送普通对象,e。字符串或任何其他对象。

     public void sentObject(Card GraczK) throws IOException 
     {

            outt.writeObject(GraczK);
            outt.flush();
            System.out.print(GraczK);

      }

CARD类型

public class Card implements Serializable {
private int Value, Colour;

private Image img;

public Card(int i, int j) {
    Colour = i;
    Value = j;
    img = new Image(null, MainWarSever.class.getResourceAsStream("/Karty/k" + Value + " (" + Colour + ").png"));
}

public int getValue() {
    return Value;
}

public int getColour() {
    return Colour;
}

public Image getImg() {
    return img;
}

}

2 个答案:

答案 0 :(得分:4)

  

我如何使用Image发送对象?

您无法序列化Image。它通常会被吸引到"发件人的图形环境采用序列化无法处理的方式。

您需要做的是将img字段标记为transient。净效应将是接收者将null视为值。如果需要,您可以通过从接收端的JAR或WAR(或其他地方)加载等效的Image来(重新)填充该字段。 (这意味着为卡片的图像添加一个"名称"以便于图像加载是个好主意。)

您可以使用自定义readObject / writeObject方法隐藏此内容,但可能需要将它们编码为与上面相同的内容......在引擎盖下。

您也可以(我猜)将Image像素转换为字节数组,然后传输,并在另一端将像素重建为Image。然而,这将使"消息臃肿"你发送,可能还有其他问题。所以我不推荐这个。

答案 1 :(得分:1)

您无法序列化图像,只需标记该字段瞬态。 如果仍想序列化它,那么替代方法是在您的类中添加另一个字段

private String imgBase64String; // Image to Base64 String.

将您的图片转换为Base64字符串。它可以序列化/反序列化。 Base64 String可以转换回Image。