Java (已解决)序列化(写入)满是对象的Arraylist不断抛出;NotSerializableException“;
我是一名Java学生,有点麻烦。所以我正在写一个名为“LinkedInCLI”的程序 它使用4个不同的类:Java (已解决)序列化(写入)满是对象的Arraylist不断抛出;NotSerializableException“;,java,exception,arraylist,io,Java,Exception,Arraylist,Io,我是一名Java学生,有点麻烦。所以我正在写一个名为“LinkedInCLI”的程序 它使用4个不同的类: 用户帐户 LinkedIn用户 LinkedInException(自定义异常) LinkedInCLI 我目前正在编写“LinkedInCLI”类来执行各种功能。其中一个功能是将“用户”添加到用户数组列表中,对象LinkedInUser由“帐户”的名称、密码和“帐户类型”定义 实际上,它们只是决定“用户”信息的所有字符串。它的构造函数如下所示 public class LinkedInU
public class LinkedInUser extends UserAccount implements java.io.Serializable ,Comparable<LinkedInUser>{
public LinkedInUser(String user, String pass , String type) {
super(user, pass, type);
}
private static List<LinkedInUser> users = new ArrayList<>();
试试{
LinkedInUser测试=新建LinkedInUser();
ObjectInputStream ois=新ObjectInputStream(新文件输入流(PATHPLUSNAME));
ArrayList UsersCopy=(ArrayList)ois.readObject();
users.addAll(usersCopied);
ois.close();
}
捕获(FileNotFoundException FNFI){
System.out.println(“未找到文件”);
}
捕获(IOException IOEXI){
System.out.println(“无法反序列化用户”);
}
捕获(ClassNotFoundException CLNI){
System.out.println(“找不到类”);
}
我的问题是:为什么这个异常会一直抛出?起初,它只是一个IOException,但后来我查找了子异常并尝试了所有异常,发现它就是“NotSerializableException”
注意:所有其他类也实现可序列化…
---------------------------------------------------------------
这个问题已经解决了,问题是我的UserAccount方法实现了serializable,但它也实现了comparable,这没有实现serializable,我通过查看oracle文档也发现了这一点。UserAccount类顶部有一些不可序列化的扫描程序
对于任何有助于与我一起讨论这个问题的人,谢谢。你们太棒了 我已经检查了您没有超级类的代码
UserAccount
-它工作正常
由于您没有提供UserAccount
的源代码,因此有两种可能:
首先,正如您所说,UserAccount
实现了java.io.Serializable
。在这种情况下,确保您的超类的所有字段(或这些字段的超类等等)也实现了java.io.Serializable
第二,事实上,您忘记了实现Serializable,或者无法实现。
在这种情况下,要扩展UserAccount
,还需要不向该类添加参数构造函数。换句话说,对于类的第一个不可序列化的超类,不需要参数构造函数
下表非常清楚地解释了这一点:
资料来源:
提示:
如果它仍然不适用于您,那么您可以尝试将UserAccount
类的字段标记为transient
,然后进行编译以查看哪个字段导致了问题。这些字段将不会序列化
transient String field;
有一个标志可以传递给JVM,让它告诉您什么是不可序列化的:我非常感谢这个建议,但我不太确定它是如何工作的?我从来没有学过“Flags”,我想我会试试-Dsun.io.serialization.extendedDebugInfo=true,@N00b他的意思是如果你按照链接从你的
LinkedInUser
到它的超类,然后递归地按照链接从每个字段到它的类,一切都必须可序列化
@chrylis onstrike-更准确地说,每个字段的值都必须可序列化。如果不可序列化字段的值为null,或者它是可序列化子类的实例,则仍可对其进行序列化。异常消息会告诉您哪个类不可序列化。把它打印出来。一般来说,你不应该用你自己的文字来代替任何例外的文字。你太棒了
try {
LinkedInUser test = new LinkedInUser();
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(PATHPLUSNAME));
ArrayList usersCopied = (ArrayList<LinkedInUser>) ois.readObject();
users.addAll(usersCopied);
ois.close();
}
catch (FileNotFoundException FNFI) {
System.out.println("The file was not found");
}
catch (IOException IOEXI) {
System.out.println("Could not Deserialize users");
}
catch (ClassNotFoundException CLNI) {
System.out.println("Could not find class");
}
transient String field;