Sobes.tech
Junior

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

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-ды жақсарту керек, ол хэш-структураларда дұрыс жұмыс істеу үшін.