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

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

Могу отправить нормальный объект, т.е. 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;
}

}

2
Pekus 28 Окт 2015 в 01:38

2 ответа

Лучший ответ

Как я могу отправить объект с помощью Image?

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

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

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

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

4
Stephen C 28 Окт 2015 в 06:18

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

private String imgBase64String; // Image to Base64 String.

Преобразовать ваше изображение в строку Base64. Его можно сериализовать / десериализовать. И Base64 String может преобразовать обратно в изображение.

2
Noor Nawaz 28 Окт 2015 в 03:46