2016-06-06 2 views
0

Я программирование игры в Java (Тетрисоподобные), но я получил эту ошибку при его запуске:Java: не Сериализуемое Исключение

java.rmi.UnmarshalException: error unmarshalling return; nested exception is: 
java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: java.awt.image.BufferedImage 
at sun.rmi.server.UnicastRef.invoke(Unknown Source) 
at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(Unknown Source) 
at java.rmi.server.RemoteObjectInvocationHandler.invoke(Unknown Source) 
at com.sun.proxy.$Proxy0.PoolPieces(Unknown Source) 
at Fenetre.<init>(Fenetre.java:196) 
at Score.lancerNewFenetre(Score.java:103) 

Так эта ошибка происходит в самом начале, когда я пытаюсь извлечь Массив «Piece» с сервера (Class «Partie» (Game)), чтобы затем установить фигуры и быть в состоянии играть. Код, который делает произойти ошибка:

try 
    { 
     this.unpool = this.ninja.PoolPieces(this.id); 
     System.out.println(unpool); 
     this.setBoutons(this.unpool); 
     System.out.println("boutons set"); 
    } 
    catch (RemoteException e) 
    { 
     e.printStackTrace(); 
    } 

Он разбивает на первой линии, где «unpool» кусок [], «Ниндзя» мой интерфейс, который я поставил в начале кода, и «PoolPieces» - мой метод, чтобы получить пул из 3 штук (Piece []). Вот код методы «PoolPieces»:

public Piece[] PoolPieces(Integer id) 
{ 
    Integer rang = this.listejoueurs[id].getRang(id); 
    Integer retour = rang + 1; 
    this.listejoueurs[id].setRang(retour); 
    this.leretourpieces = this.piecespartie[rang]; 
    return this.leretourpieces; 
} 

Я создал класс «Joueur» (игрок), и каждый игрок имеет «Rang» (ранг). Таким образом, доступные фигуры одинаковы для всех игроков, и они извлекают пул частей в соответствии с их прогрессированием в игре. «listejoueurs» - это Joueur [], это массив, содержащий разных игроков для игры. «id» - это идентификатор для связи клиента с игроком: первый добавленный игрок добавляется в ячейку 0 в массиве, а id = 0 отправляется клиенту. Следующий игрок будет иметь id = 1 и т. Д. «leretourpiece» - это моя пьеса [], которую я хочу вернуть. Он взят из Piece [] [], созданного случайным образом в начале игры. Это массив из массива 3 шт. «leretourpiece» получает пул куска в соответствии с прогрессией игрока (как объясняется выше).

После поиска этой ошибки в Интернете я внедрил Serializable практически в каждом классе, но ничего не изменилось. Странная вещь также в том, что что-то ошибка не появляется, и ей удается получить пул, возможно, когда-то более 10 намерений или около того, но затем, когда вы кладете кусочки в сетку, у меня есть проблемы с смехом, заблуждения и т. Д. (это может быть ошибка в коде, который помещает кусок в сетку, я не уверен).

Так что я полностью застрял в этой проблеме, и я не могу найти, откуда она взялась. Большое спасибо за время, потраченное на то, чтобы прочитать это, и в конце концов помогите мне :)

+0

Хорошо, я сделал изменение, которое вы предложили, но та же ошибка все еще выходит:/ –

ответ

0

Поскольку у вас нет связанного кода, его трудно дать ясный ответ. В некоторой части вашего кода вы используете BufferedImage как instance variable и попробуйте serialize что. Просто найдите связанный блок кода и переносите в тело метода как поставщик изображений. (Т.е.getMyImage())

Если вы не можете найти решение, добавьте соответствующий блок кода (где вы используете BufferedImage) в ваш вопрос, так что я могу обновить мой ответ

** EDIT **** Можете ли вы попробовать это:

Удалить ImageIcon ссылки на класс FENETRE ниже части:

private ImageIcon image1; 
private ImageIcon image2; 
private ImageIcon image3; 

И заменить эту часть:

this.image1 = new ImageIcon(this.getClass().getResource(this.nompiece1 + ".png")); 
     this.image2 = new ImageIcon(this.getClass().getResource(this.nompiece2 + ".png")); 
     this.image3 = new ImageIcon(this.getClass().getResource(this.nompiece3 + ".png")); 

с:

ImageIcon image1 = new ImageIcon(this.getClass().getResource(this.nompiece1 + ".png")); 
     ImageIcon image2 = new ImageIcon(this.getClass().getResource(this.nompiece2 + ".png")); 
     ImageIcon image3 = new ImageIcon(this.getClass().getResource(this.nompiece3 + ".png")); 
+0

Вот основная часть кода (кроме ActionListner, потому что она очень длинная, и я не думаю, что она является источником ошибки): –

+0

http://pastebin.com/pbNDqvtV (слишком долго для комментария) –

+0

The (класс) код игры "Partie": –

-1

Объект, который вы пытаетесь манипулировать с помощью RMI держит ссылку на BufferedImage и, как следует из сообщения об ошибке, java.awt.image.BufferedImage не Внедрение java.io.Serializable.

Как есть (к сожалению) часто случается с Java, лучше держаться подальше от предоставленного механизма Serializable и предоставлять свои.

(Для записи, Java дизайнеры действительно сожалеют, реализовав его в первую очередь)

Downvoters: так как вы downvote быстрее, чем вы проверяете, позвольте мне сэкономить ваше время: смотреть эти video Брайан Гетц (Java Language Architect) и в 20:59 хорошо смотрят на слайд, который говорит «сожаление о сериализации» и слушайте до 22:15.

Для остальных из нас существуют ликования, такие как Kryo, который делает это лучше, быстрее и безопаснее.

+0

Я попробую это как можно скорее и дам вам отзыв. –

+0

Цитата, пожалуйста, для вашего заявления о дизайнерах Java. – EJP

+0

@EJP Уверен: https://www.youtube.com/watch?v=K__bKr5mGXY. –

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