【问题标题】:How to make a class serializable if it include a field of "Object"如果包含“对象”字段,如何使类可序列化
【发布时间】:2014-07-13 00:32:11
【问题描述】:
public class A implements Serializable
{
    private static final long serialVersionUID = 1L;
    private Object value;
    private Type type;
....
}

它包含不可序列化的“对象”,因此A类将被呈现为不可序列化。

“对象值”可以是整数、字符串...,取决于“类型类型”

如何使 A 可序列化? 提前致谢!

编辑: 如果使用“私有瞬态对象值”,“对象值”会丢失(反序列化时)吗?我不想失去它。

有通用的可序列化Object类型吗?

【问题讨论】:

  • Java 对此有一个特定的关键字,transient。

标签: java


【解决方案1】:

“对象值”可以是整数、字符串...

Integer 和 String 都是可序列化的。它会起作用的。你不需要做任何特别的事情来序列化它们。

有通用的可序列化Object类型吗?

是的,可序列化:

private Serializable value;

【讨论】:

  • 我试图通过网络将 A 作为消息发送(到 JMS 队列)并得到 Not Serializable 异常。
  • @user2179277 然后你试图序列化其他不是整数或字符串的东西。但是 Integer 和 String 都是可序列化的。
  • @user2179277 您是否混淆了intInteger?第一个是原语,第二个是类。
  • @Takendarkk 您不能将 int 分配给 Object 变量而不使其变为 Integer,因此这不可能是“不可序列化”问题的原因。
  • 我知道自动装箱。我只是不确定 OP 是否运行了他显示的 exact 代码。
【解决方案2】:

您可以使用瞬态关键字跳过字段的序列化:

private transient Object value;

【讨论】:

  • 谢谢朱瓦尼斯。如果使用“私有瞬态对象值”,“对象值”会丢失(反序列化时)吗?我不想失去它。
  • @user2179277:对象序列化不允许使用的变量。这样值的状态在反序列化后将始终默认为默认值。例如变量 x 的值设置为 9,它的默认值为 '0',也就是说,当对象已被序列化为 x 的值为 9 时,反序列化后将默认为 '0'
【解决方案3】:

transient 关键字服务器的目的

private transient Object value;

如果对象不代表您的实例,则另一种方法是使对象静态。静态变量隐式为transient

如果使用“私有瞬态对象值”,“对象值”会丢失(反序列化时)吗?我不想失去它。

如果你不序列化变量,它的值将会丢失。序列化保存类实例的状态。当实例将被反序列化时,它将在其中包含 Object 值,但它将被初始化为默认值,即 null。所以是的,值将会丢失,这无论如何都是使变量瞬态的目的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-11
    • 1970-01-01
    • 2011-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多