2015-10-27 4 views
2

Как я могу отправить объект с Image? Я получаю эту ошибку:Как сериализовать объект, содержащий изображение?

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

Я могу отправить нормальный объект, e. String или любые другие объекты.

 public void sentObject(Card GraczK) throws IOException 
    { 

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

     } 

Тип карты

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; 
} 

}

ответ

4

How i can sent object with an Image ?

Вы не можете сериализовать Image. Обычно он «подключается» к графической среде отправителя способами, с которыми сериализация не справляется.

Что вам нужно сделать, это отметить поле img как transient. Чистым эффектом будет то, что получатель видит null в качестве значения. Если вам нужно, вы можете (повторно) заполнить поле, загрузив эквивалентный Image из JAR или WAR (или в другое место) на принимающей стороне. (Это означает, что было бы неплохо включить «имя» для изображения карты для облегчения загрузки изображения.)

Вы можете использовать специальные методы readObject/writeObject, чтобы скрыть это, но их, вероятно, необходимо закодировать сделать то же самое, что и выше ... под капотом.

Вы также можете (я думаю) превратить Image пикселей в массив байтов, передать это и восстановить пиксели в Image на другом конце. Однако это вызовет раздувание «сообщения», которое вы отправляете, и могут возникнуть дополнительные проблемы. Поэтому я бы не рекомендовал этого.

+0

Отличный чувак! благодаря! – Pekus

1

Вы не можете сериализовать изображение, просто отметьте этот переходный период. Если еще хотите сериализовать, то альтернатива добавить еще одно поле в класс

private String imgBase64String; // Image to Base64 String. 

преобразовать изображение в Base64 String. Он может быть сериализован/десериализован. И Base64 String может преобразовать обратно в Image.

Смежные вопросы