Java:不可序列化的异常

时间:2016-06-06 10:23:32

标签: java serialization

我正在编写一个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个意图,但是,当把这些碎片放在网格上时,我会出现问题,错位等等(这可能是将片段放在网格上的代码中的错误,我不确定。)

所以我很困惑这个问题,我无法找到它的来源。非常感谢您提前阅读本文所花费的时间,并最终帮助我:)

2 个答案:

答案 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更好,更快,更安全。