【问题标题】:Serializing object that contains ArrayList of objects序列化包含对象 ArrayList 的对象
【发布时间】:2014-07-10 18:25:45
【问题描述】:
public class User  implements  Serializable{

    public String name;
    public String surname;
    public List<Picked> pickedBooks = new ArrayList<>();

    // Code omitted.
}

然后去上课:

public class Picked {

    public Book book;
    public int period;
    public int cost;

    // Code omitted.
}

和课本:

public class Book {

    public String name;
    public String bookTitle;
    public int howMany;

    // Code omitted.
}

所以我主要创建新用户并对其进行序列化:

User user = new User();
user.setName("John");
user.setSurname("James");
String fileName = "data.bin";
try (ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream(fileName))) {
    os.writeObject(user);
} catch (IOException ex) {
    Logger.getLogger(Library.class.getName()).log(Level.SEVERE, null, ex);
}

一切都很完美,但如果我这样做:

Book book = new Book("Dan Brown", "Angels and Demons", 1);
Picked pck = new Picked(book, 20, 2);
user.add(pck);

然后我想序列化对象用户,程序崩溃了。 我得到的输出是:

java.io.NotSerializableException: 在 java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1183) 在 java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:347) 在 java.util.ArrayList.writeObject(ArrayList.java:742) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:606) 在 java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:988) 在 java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1495) 在 java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1431) 在 java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1177) 在 java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1547) 在 java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1508) 在 java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1431) 在 java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1177) 在 java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:347)

【问题讨论】:

    标签: java list object serialization arraylist


    【解决方案1】:

    PickedBook也需要实现Serializable

    【讨论】:

    • com.mif.vyub1222.biblioteka.Pasiemimas.也是如此
    • 是的,vyub1222.biblioteka.Pasiemimas 是 Picked 类,我从母语翻译成英文,但忘记改错误 :) @EJP
    【解决方案2】:

    如果您的对象没有实现 java.io.Serializable,则此代码将抛出 NotSerializableException,这同样适用于其所有非静态和非瞬态数据成员,以此类推,直到关闭。使用指定的 SerialVersionUID 更好,因此 JVM 不会在运行时计算它。请同时实现 Serializable to Picked 和 Book 类。

    如果是数组或集合,数组或集合的所有对象都必须是可序列化的。如果任何对象不可序列化,则序列化将失败。

    如果你的类中有内部类,那么内部类总是包含对其外部类的隐式引用,你不能序列化内部类,除非外部类也是可序列化的。其实不建议尝试;

    查看此参考http://docs.oracle.com/javase/7/docs/platform/serialization/spec/serial-arch.html#4539

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-02
      • 1970-01-01
      • 2013-01-18
      • 2012-03-12
      相关资源
      最近更新 更多