Sobes.tech
Назад к вопросам
Junior
14

import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlType; import java.io.*; @XmlAccessorType(XmlAccessType.PROPERTY) @XmlType(name = "Person", propOrder = { "name", "surname", "address", "phone", }) public class Person implements Serializable, Externalizable { private String name; private String surname; public String address; public String phone; public Person(String name, String surname) { this.name = name; this.surname = surname; } public String getName() { return name; } public String getSurname() { return surname; } @Override public int hashCode() { return 1; } @Override public boolean equals(Object o) { if (this == o) { return true; } if (o == null || getClass() != o.getClass()) { return false; } Person person = (Person) o; if (name != null ? !name.equals(person.name) : person.name != null) { return false; } if (surname != null ? !surname.equals(person.surname) : person.surname != null) { return false; } return true; } @Override public void writeExternal(ObjectOutput out) throws IOException { out.writeObject(name); out.writeObject(surname); out.writeObject(phone); out.writeObject(address); } @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException { name = (String) in.readObject(); surname = (String) in.readObject(); address = (String) in.readObject(); phone = (String) in.readObject(); } }

Компании, где спрашивали
ИП Ганус Александр Андреевич

Ответ от нейросети

sobes.tech AI

В данном классе Person реализованы интерфейсы Serializable и Externalizable, что влияет на сериализацию объекта.

Особенности:

  • Используется @XmlAccessorType(XmlAccessType.PROPERTY), значит JAXB будет работать через геттеры/сеттеры.
  • Класс реализует Externalizable, поэтому методы writeExternal и readExternal полностью контролируют процесс сериализации.
  • В writeExternal записываются поля name, surname, phone, address.
  • В readExternal читаются поля в том же порядке.
  • Поля name и surname приватные с геттерами, address и phone — публичные.
  • hashCode всегда возвращает 1 — это плохая практика, может привести к проблемам в коллекциях.
  • equals сравнивает только name и surname.

Пример использования сериализации с Externalizable:

Person p = new Person("Ivan", "Ivanov");
p.address = "Moscow";
p.phone = "+79991234567";

// Сериализация
try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("person.dat"))) {
    oos.writeObject(p);
}

// Десериализация
try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("person.dat"))) {
    Person p2 = (Person) ois.readObject();
}

Важно, что при Externalizable порядок записи и чтения полей должен строго совпадать. Также стоит улучшить hashCode для корректной работы в хэш-структурах.