Sobes.tech
Junior

Javaда талаалардын сериализациясынан кантип чыгарып салуу керек?

sobes.tech AI

AIден жооп

Сериализациядан өрістерди чыгарып салуунун бир нече жолдору бар:

  1. Ключевое слово 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;
        }
    
        // Геттерлер жана сеттерлер
    }
    
  2. 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` деп белгиленген, бирок десериализациялануусу керек болсо, 
            // аларды ушул жерде десериализациялайбыз
        }
    
        // Геттерлер жана сеттерлер
    }
    
  3. 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 колдонуу эң жөнөкөй жана натыйжалуу болуп саналат.