Java (已解决)序列化(写入)满是对象的Arraylist不断抛出;NotSerializableException“;

Java (已解决)序列化(写入)满是对象的Arraylist不断抛出;NotSerializableException“;,java,exception,arraylist,io,Java,Exception,Arraylist,Io,我是一名Java学生,有点麻烦。所以我正在写一个名为“LinkedInCLI”的程序 它使用4个不同的类: 用户帐户 LinkedIn用户 LinkedInException(自定义异常) LinkedInCLI 我目前正在编写“LinkedInCLI”类来执行各种功能。其中一个功能是将“用户”添加到用户数组列表中,对象LinkedInUser由“帐户”的名称、密码和“帐户类型”定义 实际上,它们只是决定“用户”信息的所有字符串。它的构造函数如下所示 public class LinkedInU

我是一名Java学生,有点麻烦。所以我正在写一个名为“LinkedInCLI”的程序 它使用4个不同的类:

  • 用户帐户
  • LinkedIn用户
  • LinkedInException(自定义异常)
  • LinkedInCLI
  • 我目前正在编写“LinkedInCLI”类来执行各种功能。其中一个功能是将“用户”添加到用户数组列表中,对象LinkedInUser由“帐户”的名称、密码和“帐户类型”定义

    实际上,它们只是决定“用户”信息的所有字符串。它的构造函数如下所示

    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;