Не удается найти элемент в списке после сериализации - PullRequest
0 голосов
/ 03 декабря 2018

Сначала я создаю элемент A. Затем я добавляю элемент A в список A. Затем я сериализую элемент A в файл, а затем считываю элемент A из того же файла.Наконец, я не могу найти прочитанный элемент B из списка A. Найти элемент B в списке A. не удается.Результат оператора println равен -1.У меня вопрос, почему?

public class ListTest {

    public static void main(String[] args) {

        Item a = new Item("a");
        List<Item> listA = new ArrayList<Item>();
        listA.add(a);

        try (FileOutputStream fos = new FileOutputStream(new File("text.dat"));
            ObjectOutputStream oos = new ObjectOutputStream(fos)) {         
            oos.writeObject(a);         

            try (FileInputStream fis = new FileInputStream(new File("text.dat"));
                    ObjectInputStream ois = new ObjectInputStream(fis)) {
                        Item b = (Item) ois.readObject();           
                        System.out.println(listA.indexOf(b));           
            }

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();                    
        } catch (ClassNotFoundException ex) {
            ex.printStackTrace();
        }
    }
}

** РЕДАКТИРОВАТЬ 1 **

Где находится код товара.

public class Item implements Serializable {

    private static final long serialVersionUID = 1L;

    private String mName;

    public Item(String name) {
        mName = name;
    }

    public String getName() {
        return mName;
    }

    public void setName(String name) {
        mName = name;
    }
}

1 Ответ

0 голосов
/ 03 декабря 2018

Есть 2 проблемы с вашим кодом:

  1. Чтобы проверить, присутствует ли элемент в списке, вам нужно использовать .contains() Изменить это

    listA.indexOf(b);
    

    до

    listA.contains(b);
    

    Из документов

    boolean contains(Object o)

    Возвращает true, если этот список содержит указанный элемент.Более формально, возвращает true тогда и только тогда, когда этот список содержит хотя бы один элемент e такой, что (o == null? E == null: o.equals (e)).

  2. Теперь, поскольку вы проверяете равенство объектов, вам необходимо переопределить equals() и hashcode() в классе Item.Добавьте следующие методы к Item

    class Item implements Serializable {
    
        private static final long serialVersionUID = 1L;
    
        private String mName;
    
        // getters and setters
    
        @Override
        public int hashCode() {
            final int prime = 31;
            int result = 1;
            result = prime * result + ((mName == null) ? 0 : mName.hashCode());
            return result;
        }
    
        @Override
        public boolean equals(Object obj) {
            if (this == obj)
                return true;
            if (obj == null)
                return false;
            if (getClass() != obj.getClass())
                return false;
            Item other = (Item) obj;
            if (mName == null) {
                if (other.mName != null)
                    return false;
            } else if (!mName.equals(other.mName))
                return false;
            return true;
        }
    
    }   
    

    Теперь вы знаете, что два объекта равны, если все свойства объекта имеют одинаковое значение.Если вы теперь проверите contains(), он вернет true.

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