【问题标题】:Java, Serialization, can you serialize a class within a class [duplicate]Java,序列化,你可以在一个类中序列化一个类吗[重复]
【发布时间】:2013-01-09 16:57:24
【问题描述】:

可能重复:
Why is a serializable inner class not serializable?

我有一个没有实现Serializable 的类。在该类内部,我有一个数据类,它保存整个程序的数据,该程序实现 Serializable 并具有版本 ID。

我的问题是,当我尝试在主类中序列化数据对象时,我从主类而不是数据类中收到对象写入错误。主类没有实现Serializable

你能在一个不可序列化的类中序列化一个类吗?

例子:

class main
{
   class data implements Serializable
   {  // data and functions }

   public void main(args)
   { data d = new data();
     // ofcourse I have the proper inits and checks for the output stream and such
     writeObject(data);  // Throws Class not Serializable error.}
} 

【问题讨论】:

  • 如果你的data 类是static 我认为应该可以。
  • 这是什么.writeObject() 方法? data 不是 ObjectOutputStream
  • 我知道我写对了代码,这是一个比我写对代码更抽象的问题。是的,我认为它是复制品。

标签: java


【解决方案1】:

由于data 不是static,它隐含地引用了它的外部类main,它不是可序列化的。

尝试创建课程static

【讨论】:

  • 我对java并不陌生,但是将类设为静态有什么假设?为什么让它静态工作?
  • static 意味着它没有对外部类的隐式引用,即它删除了对不可序列化的类的引用。顺便说一句,如果可以的话,我会让每个嵌套类 static
  • @user1596244 代码方面的一个区别是,如果您要从外部main 访问您的data 类,则需要main 的实例才能实例化data,就像在 (ewww) new main().new data() 中一样。如果data 是静态的,您只需要new main.data() 而不必拥有main 的实例。
  • 我的外部非串行类的成员是 data d = new Data();。将数据类设为静态,这是否意味着外部类中的方法和函数可以或仍然不能访问此数据对象。我认为它没有问题。 (OP 中的 TYPO,我有数据 d,在 main 之外)
  • 外部类可以访问内部类中的任何内容,如果它具有对实例的引用。内部类可以访问外部类上的任何内容,如果它有对它的引用。 static 是没有对外部类实例的隐式引用。
【解决方案2】:

如果你反编译你的 main.class,你会在真实代码中看到它

public class main {

    class data implements Serializable {
        final main this$0;

        data() {
            this$0 = main.this;
        }
    }
}

data 包含对其外部类main 的引用。这个所谓的合成字段是由 javac 添加的。当 ObjectOutputStream 尝试序列化数据时,它偶然发现对不可序列化类的引用并中断。所以要序列化你应该让main也实现Serializable,或者让data静态类然后对main的引用会去

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-19
    • 1970-01-01
    • 2013-02-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多