仅在未直接分配的情况下,ArrayList在被序列化后为空

时间:2017-07-03 11:37:57

标签: java arraylist reference serializable

发送/接收包含ArrayList的Serializable对象时遇到问题。我有一个看起来像这样的机器人:

public class Robot {
    private ArrayList<InstructionCard> pool;
    /*other fields... */

    public void refillPool(Deck deck) {
        int nCards = this.healthPoints - this.pool.size();
        if(nCards >= 1) {
            ArrayList<InstructionCard> cards = deck.draw(nCards);
            //we add the cards to the old pool
            for(int i = 0; i < cards.size(); i++) {
                this.pool.add(cards.get(i)); // A
            }
            //pool = cards;  //REPLACE THE FOR LOOP WITH THIS LINE DOES THE JOB
        }
    }

    public RobotInfo getInfo(){
       return new RobotInfo(this.pool);
    }
}

我使用Robot对象中包含的信息来创建可通过连接发送的可序列化对象RobotInfo:

public class RobotInfo implements Serializable {
     private ArrayList<InstructionCard> pool;

     public RobotInfo(ArrayList<InstructionCard> p) {
         pool = p;
     }
}

但是,当我收到这样的对象时,该池是一个空的ArrayList。 InstructionCard implements Serializable也是如此,它只包含一个int和一个String字段。

我做了一些测试,我确信在发送RobotInfo对象之前,pool.size()不是0

当我收到包含它的消息时,pool.size() returns 0,除非(这是我完全不理解的)我用refillPool()方法直接替换for循环分配

我认为我必须在A点InstructionCard引用时做错了(对我来说似乎不是Serializable相关的问题)。

真正的问题是为什么RobotInfo中的池在两种情况下都不是空的,但只有在我使用for循环时才变空?

编辑:我能够做出一个临时的解决方法,用ArrayList<InstructionCard>替换ArrayList<String>,每次需要发送RobotInfo对象时重新创建它。这在某种程度上让我觉得更多只是某种参考问题。

1 个答案:

答案 0 :(得分:0)

我在这里猜测

private ArrayList<InstructionCard> pool;

离开 pool null

所以这段代码:

pool = cards; 

会将非空引用放入池中。

另一方面;这意味着cards.size()实际上是0;因为你会遇到NullPointerException

for(int i = 0; i < cards.size(); i++){
 this.pool.add(cards.get(i));