可序列化对象的瞬态属性被反序列化为null

时间:2014-12-08 12:21:25

标签: java serialization nullpointerexception server transient

所以我有这个课程:

public class Message implements Serializable{

    private static final long serialVersionUID = 1L;
    private Location click;
    private String conection;
    private transient ArrayList<Location> allLocations = new ArrayList<Location>();
    private transient ArrayList<Snake> allSnakes = new ArrayList<Snake>();
    private transient ArrayList<Location> allObstacles = new ArrayList<Location>();
    private transient ArrayList<Location> allPowerups = new ArrayList<Location>();
    private boolean isConnecting;
    ........
}

我需要通过一个有效的ObjectStream发送它。 不幸的是,那种类型的数组列表是不可序列化的,因此我将“瞬态”列为“瞬态”。之前的关键字。 使用.readObject()反序列化时,所有列表都为null。 所以我的问题是,客户端/服务器如何相互发送这些列表?

3 个答案:

答案 0 :(得分:1)

  

所以我的问题是,客户端/服务器如何相互发送这些列表?

好吧,通过将这些属性标记为transient,您隐式告知 ObjectOutputStream不发送它们。

如果您需要发送它们:

  • 删除transient修饰符,然后将LocationSnake类更改为可序列化,或者

  • 编写自定义readObjectwriteObject方法以手动序列化和反序列化这些列表&#34;

使这些类序列化可以像将implements Serializable添加到相应的类声明一样简单。

答案 1 :(得分:0)

ArrayList是Serializable。

似乎位置 Snake 不是。因此,只需将它们序列化并删除瞬态

答案 2 :(得分:0)

瞬态意味着您不希望序列化该属性。但在你的情况下,你似乎错了。 ArrayList是可序列化的,但是为了序列化整个列表,它的所有元素也将被序列化。因此,请确保您在List中放置的是可执行序列化的。