(Решено) Сериализация (запись) Arraylist, заполненного объектами, продолжает выдавать «NotSerializableException» - PullRequest
0 голосов
/ 02 февраля 2020

Я - Java студент, у которого есть небольшие проблемы. Поэтому я пишу программу под названием «LinkedInCLI», которая использует 4 различных класса:

  1. UserAccount
  2. LinkedInUser
  3. LinkedInException (Custom Exception)
  4. 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);
}

Хорошо, теперь уже к вопросу:

Как только я создал этих пользователей, они go добавили ArrayList в LinkedInUsers, который выглядит следующим образом.

private static List<LinkedInUser> users = new ArrayList<>();

Он расположен внутри LinkedInCLI и НЕ внутри основного метода. он расположен рядом с приватными полями и т. д.

Я хочу сериализовать ArrayList в файл .DAT, после того, как я это сделаю, я хочу завершить свою программу, выполнить ее снова и прочитать предыдущий ArrayList из выполнение программы. Как только я это сделаю, ArrayList должен быть таким же, как и выполнение до него.

Но я продолжаю сталкиваться с «NotSerializableException». Я уже написал ObjectOutputStream и ObjectInputStream, и они выглядят правильно написанными, но что-то не так, и это не будет писать объект. Вот как выглядят мои потоки

ObjectOutputStream oos = null;

             try
                {

                 // CREATE file path and display it

                new File(PATH).mkdirs();


                System.out.println(PATH);


                 // SAVE arraylist
                    oos = new ObjectOutputStream(new FileOutputStream(PATHPLUSNAME)); 

                    oos.writeObject(users);
                    System.out.println("Writing users to file");
                    System.out.println(": " + users);



                //CLOSE resources
                    oos.flush();
                    oos.close(); 




                } 
             catch (FileNotFoundException FNFO) {
                    System.out.println("The file was not found");
                }
            catch(NotSerializableException NSEO) {
                System.out.println("Type is not serializable");
            }
                catch (IOException IOEXO) { 
                    System.out.println("Could not serialize users"); 
                } 

 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");
    }

Мой вопрос действительно такой: почему, черт возьми, это исключение продолжает выдавать ? Сначала это было только IOException, но потом я посмотрел под исключения и попробовал их все, и выяснил, что это именно NotSerializableException.

ПРИМЕЧАНИЕ. Все остальные классы также реализуют сериализуемый ...

--------------------------- ------------------------------------------------- Эта проблема была решена, проблема заключалась в том, что мой метод UserAccount реализует сериализуемый, НО он также реализовал сопоставимый, который НЕ реализует сериализуемый, я узнал это, посмотрев документ oracle, также , Вверху класса UserAccount было несколько случайных сканеров, которые также нельзя было сериализовать.

Всем, кто помогает мне решить эту проблему, спасибо. Вы, ребята, потрясающие!

1 Ответ

0 голосов
/ 02 февраля 2020

Я проверил ваш код без суперкласса UserAccount - он отлично работает.

Поскольку вы не указали исходный код UserAccount, есть две возможности:

Во-первых, UserAccount реализует java.io.Serializable действительно, как вы сказали. В таком случае убедитесь, что все поля вашего суперкласса (или суперклассы этих полей и т. Д.) Также реализуют java.io.Serializable.

Второе - когда на самом деле вы забыли реализовать Serializable или как-то не может. В таком случае для расширения UserAccount вам также необходимо добавить конструктор без аргументов в этот класс. Другими словами, вам понадобится конструктор без аргументов для первого несериализуемого суперкласса вашего класса.

Следующая таблица объясняет это очень четко:

Summary of possible cases and solutions Источник: Изображение

Подсказка: Если это все еще не работает для вас, вы можете попробовать пометить поля класса UserAccount как transient, а затем скомпилировать, чтобы увидеть, какое из них вызывает проблемы. , Эти поля не будут сериализованы.

transient String field;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...