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