【问题标题】:transient atributes of serializeable object are being deserialized as null可序列化对象的瞬态属性被反序列化为 null
【发布时间】:2014-12-08 12:21:24
【问题描述】:

所以我有这门课:

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 发送它。 不幸的是,该类型的arrayLists 是不可序列化的,因此我在它之前放置了'transient' 关键字。 当使用 .readObject() 反序列化它时,所有列表都为空。 所以我的问题是,客户端/服务器如何相互发送这些列表?

【问题讨论】:

    标签: java serialization nullpointerexception server transient


    【解决方案1】:

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

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

    如果您需要发送它们:

    • 删除 transient 修饰符并更改 LocationSnake 类以使其可序列化,或者

    • 编写自定义 readObjectwriteObject 方法以“手动”序列化和反序列化这些列表。

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

    【讨论】:

      【解决方案2】:

      ArrayList 是可序列化的。

      您的 LocationSnake 似乎不是。所以只需让它们可序列化并移除transient

      【讨论】:

        【解决方案3】:

        瞬态意味着您不希望该属性被序列化。但在你的情况下,你似乎错了。 ArrayList 是可序列化的,但要序列化其所有元素的整个列表也将被序列化。因此,请确保您放入 List 中的任何内容都实现了可序列化。

        【讨论】:

          猜你喜欢
          • 2012-10-04
          • 2015-10-18
          • 2021-04-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-12-27
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多