В данном классе Person реализованы интерфейсы Serializable и Externalizable, что влияет на сериализацию объекта.
import javax.xml.bind.annotation.XmlAccessType;
В данном классе Person реализованы интерфейсы Serializable и Externalizable, что влияет на сериализацию объекта.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
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();
}
}
Ответ
В данном классе 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 для корректной работы в хэш-структурах.