我正在编写一个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)
因此,当我尝试从服务器(类“Partie”(游戏))中检索“Piece”数组时,会发生此错误,然后设置碎片并能够播放。发生错误的代码是:
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”是Piece [],“ninja”是我在代码开头设置的界面,“PoolPieces”是我获取3个池的方法(片[])。以下是“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”(玩家)类,每个玩家都有一个“响”(等级)。因此,可用的棋子对于所有玩家来说都是相同的,并且他们根据他们在游戏中的进展来检索棋子。 “listejoueurs”是一个Joueur [],它是一个包含游戏不同玩家的数组。 “id”是将客户端与播放器链接的标识符:添加的第一个播放器添加到阵列中的第0位,并且id = 0被发送到客户端。下一个玩家将拥有id = 1,依此类推。 “leretourpiece”是我要回归的片段[]。它取自在游戏开始时随机创建的Piece [] []。它是一个3件阵列的阵列。 “leretourpiece”根据玩家的进展得到一块(如上所述)。
在互联网上查找错误后,我几乎在每个类中都实现了Serializable,但没有任何改变。奇怪的是,错误没有显示出来,并成功获得了游泳池,可能一次超过10个意图,但是,当把这些碎片放在网格上时,我会出现问题,错位等等(这可能是将片段放在网格上的代码中的错误,我不确定。)
所以我很困惑这个问题,我无法找到它的来源。非常感谢您提前阅读本文所花费的时间,并最终帮助我:)
答案 0 :(得分:0)
由于你没有相关的代码阻止,很难给出明确的答案。在代码的某些部分,您使用BufferedImage
作为instance variable并尝试序列化。只需找到相关的代码块并作为图像提供者进入方法体。 (即 getMyImage())
如果找不到解决方案,请将相关代码块(您使用BufferedImage的地方)添加到您的问题中,以便我可以更新我的答案
**编辑**** 你可以试试这个:
删除部分 Fenetre 上的 ImageIcon 引用:
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"));
答案 1 :(得分:-1)
您尝试通过RMI操纵的对象包含对BufferedImage
的引用,并且正如错误消息所暗示的那样,java.awt.image.BufferedImage
未实现java.io.Serializable
。
原则上(不幸的是)通常是Java的情况,最好远离提供的提供的Serializable机制。
(为了记录,Java设计者实际上很遗憾首先实现它)
Downvoters :由于你的投票速度比你检查的速度快,让我节省你一些时间:看看Brian Goetz(Java语言架构师)的这个video,并且在20:59有一个好的看看说“后悔序列化”的幻灯片,直到大约22:15听。
对于我们其他人来说,那里有图书馆,例如Kryo更好,更快,更安全。