Sobes.tech
Junior

Java-da sahələri serializasiyadan necə çıxarmaq olar?

sobes.tech Süni İntellekt

AI-dan cavab

Serializasiya zamanı sahələri istisna etmək üçün bir neçə üsul mövcuddur:

  1. transient açar sözündən istifadə: Ən sadə və yaygın üsul. Bu modifikator ilə işarələnmiş sahə Java-nın standart serializasiya mexanizmi tərəfindən nəzərə alınmır.

    public class MyClass implements java.io.Serializable {
        private String essentialField;
        private transient String secretField; // Bu sahə serializasiya olunmayacaq
    
        public MyClass(String essentialField, String secretField) {
            this.essentialField = essentialField;
            this.secretField = secretField;
        }
    
        // Getter və setterlər
    }
    
  2. writeObjectreadObject metodlarının override edilməsi: Serializasiya və deserializasiya prosesinə tam nəzarət imkanı verir, hansı sahələrin saxlanacağını (writeObjectdə) və bərpa olunacağını (readObjectdə) müəyyən edir.

    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; // Bu sahəni istisna etmək istəyirik
    
        public MyClass(String fieldToSerialize, String fieldToExclude) {
            this.fieldToSerialize = fieldToSerialize;
            this.fieldToExclude = fieldToExclude;
        }
    
        private void writeObject(ObjectOutputStream out) throws IOException {
            // Yalnız lazım olan sahələri serializasiya edirik
            out.defaultWriteObject(); // Transient olmayan, əl ilə istisna edilməmiş sahələri serializasiya edir
            // Əgər transient kimi işarələnmiş, lakin serializasiya olunmalı sahələr varsa,
            // və ya xüsusi serializasiya tələb edən sahələr varsa, onları burada serializasiya etmək olar
        }
    
        private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
            // Yalnız lazım olan sahələri deserializasiya edirik
            in.defaultReadObject(); // Transient olmayan, əl ilə istisna edilməmiş sahələri deserializasiya edir
            // Əgər transient kimi işarələnmiş, lakin deserializasiya olunmalı sahələr varsa,
            // onları burada deserializasiya etmək olar
        }
    
        // Getter və setterlər
    }
    
  3. Externalizable interfeysindən istifadə: Serializasiya üzərində tam nəzarət imkanı verir və writeExternalreadExternal metodlarının implementasiyasını tələb edir. Bu, Serializable-dən daha çevik yanaşmadır, lakin daha çox əl əməyini tələb edir.

    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; // Bu sahəni istisna etmək istəyirik
    
        // Externalizable üçün açıq və ictimai konstruktor vacibdir
        public MyClass() {
        }
    
        public MyClass(String fieldToSerialize, String fieldToExclude) {
            this.fieldToSerialize = fieldToSerialize;
            this.fieldToExclude = fieldToExclude;
        }
    
        @Override
        public void writeExternal(ObjectOutput out) throws IOException {
            // Aydın şəkildə serializasiya edirik
            out.writeObject(fieldToSerialize);
            // fieldToExclude serializasiya edilmir
        }
    
        @Override
        public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
            // Aydın şəkildə deserializasiya edirik
            fieldToSerialize = (String) in.readObject();
            // fieldToExclude deserializasiya edilmir
        }
    
        // Getter və setterlər
    }
    

Seçim konkret tapşırıq və serializasiya prosesinə nəzarət səviyyəsindən asılıdır. Ən sadə üsul transient istifadə etməkdir.