Javaда талаалардын сериализациясынан кантип чыгарып салуу керек?
sobes.tech AI
AIден жооп
Сериализациядан өрістерди чыгарып салуунун бир нече жолдору бар:
-
Ключевое слово
transientколдонуу: Бул эң жөнөкөй жана кеңири тараган ыкма. Бул өзгөрмө белгиленген болсо, ал Javaнын стандарттык сериализация механизми тарабынан эске алынбайт:public class MyClass implements java.io.Serializable { private String essentialField; private transient String secretField; // Бул өрөөн сериализацияланбайт public MyClass(String essentialField, String secretField) { this.essentialField = essentialField; this.secretField = secretField; } // Геттерлер жана сеттерлер } -
writeObjectжанаreadObjectметоддорун кайра аныктоо: Бул сериализация жана десериализация процесстерин толук көзөмөлдөөгө мүмкүндүк берет, кайсы өрөөндөр сакталары жана калыбына келтирилери белгиленет:import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; public class MyClass implements Serializable { private String fieldToSerialize; private String fieldToExclude; // Бул өрөөндү чыгарып салгыбыз келет public MyClass(String fieldToSerialize, String fieldToExclude) { this.fieldToSerialize = fieldToSerialize; this.fieldToExclude = fieldToExclude; } private void writeObject(ObjectOutputStream out) throws IOException { // Кажет болгон өрөөндөрдү гана сериализациялайбыз out.defaultWriteObject(); // Бул `transient` эмес, өзгөчө белгиленбеген өрөөндөрдү сериализациялайт // Эгер `transient` деп белгиленген, бирок сериализациялануусу керек болсо, // же өзгөчө сериализацияны талап кылган өрөөндөр болсо, аларды ушул жерде сериализациялайбыз } private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { // Кажет болгон өрөөндөрдү гана десериализациялайбыз in.defaultReadObject(); // Бул `transient` эмес, өзгөчө белгиленбеген өрөөндөрдү десериализациялайт // Эгер `transient` деп белгиленген, бирок десериализациялануусу керек болсо, // аларды ушул жерде десериализациялайбыз } // Геттерлер жана сеттерлер } -
Externalizableинтерфейсин колдонуу: Бул сериализацияны толук көзөмөлдөөгө мүмкүндүк берет,writeExternalжанаreadExternalметоддорун ишке ашырууну талап кылат. БулSerializableге караганда көбүрөөк кол менен башкарууну камсыз кылат:import java.io.Externalizable; import java.io.IOException; import java.io.ObjectInput; import java.io.ObjectOutput; public class MyClass implements Externalizable { private String fieldToSerialize; private String fieldToExclude; // Бул өрөөндү чыгарып салгыбыз келет // Публичтук аргументсиз конструктор керек public MyClass() { } public MyClass(String fieldToSerialize, String fieldToExclude) { this.fieldToSerialize = fieldToSerialize; this.fieldToExclude = fieldToExclude; } @Override public void writeExternal(ObjectOutput out) throws IOException { // Сериализацияны так белгилөө out.writeObject(fieldToSerialize); // fieldToExclude сериализацияланбайт } @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException { // Десериализацияны так белгилөө fieldToSerialize = (String) in.readObject(); // fieldToExclude десериализацияланбайт } // Геттерлер жана сеттерлер }
Тандоо конкреттүү милдетке жана сериализация процесси боюнча талаптарга жараша болот. Көпчүлүк учурларда transient колдонуу эң жөнөкөй жана натыйжалуу болуп саналат.