Sobes.tech
Junior

Cum să excluzi câmpurile din serializare în Java?

sobes.tech AI

Răspuns de la AI

Există mai multe modalități de a exclude câmpurile din serializare:

  1. Utilizarea cuvântului cheie transient: Cea mai simplă și comună metodă. Câmpul marcat cu acest modificator este ignorat de mecanismul standard de serializare Java.

    public class MyClass implements java.io.Serializable {
        private String essentialField;
        private transient String secretField; // Acest câmp nu va fi serializat
    
        public MyClass(String essentialField, String secretField) {
            this.essentialField = essentialField;
            this.secretField = secretField;
        }
    
        // Getteri și setteri
    }
    
  2. Suprascrierea metodelor writeObject și readObject: Permite control total asupra procesului de serializare și deserializare, determinând ce câmpuri să fie salvate (în writeObject) și restaurate (în 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; // Acest câmp dorim să îl excludem
    
        public MyClass(String fieldToSerialize, String fieldToExclude) {
            this.fieldToSerialize = fieldToSerialize;
            this.fieldToExclude = fieldToExclude;
        }
    
        private void writeObject(ObjectOutputStream out) throws IOException {
            // Serializăm doar câmpurile necesare
            out.defaultWriteObject(); // Serializază câmpurile non-transient, neexcluse manual
            // Dacă există câmpuri marcate ca transient dar care trebuie serializate,
            // sau câmpuri ce trebuie serializate în mod specific,
            // acestea pot fi serializate manual aici
        }
    
        private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
            // Deserializăm doar câmpurile necesare
            in.defaultReadObject(); // Deserializază câmpurile non-transient, neexcluse manual
            // Dacă există câmpuri marcate ca transient dar care trebuie deserializate,
            // acestea pot fi deserializate manual aici
        }
    
        // Getteri și setteri
    }
    
  3. Utilizarea interfeței Externalizable: Oferă control complet asupra serializării, necesitând implementarea metodelor writeExternal și readExternal. Este o abordare mai flexibilă decât Serializable, dar necesită mai mult management manual.

    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; // Acest câmp dorim să îl excludem
    
        // Constructor public obligatoriu pentru Externalizable
        public MyClass() {
        }
    
        public MyClass(String fieldToSerialize, String fieldToExclude) {
            this.fieldToSerialize = fieldToSerialize;
            this.fieldToExclude = fieldToExclude;
        }
    
        @Override
        public void writeExternal(ObjectOutput out) throws IOException {
            // Specificăm explicit ce serializăm
            out.writeObject(fieldToSerialize);
            // fieldToExclude nu este serializat
        }
    
        @Override
        public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
            // Specificăm explicit ce deserializăm
            fieldToSerialize = (String) in.readObject();
            // fieldToExclude nu este deserializat
        }
    
        // Getteri și setteri
    }
    

Alegerea metodei depinde de sarcina specifică și de nivelul de control dorit asupra procesului de serializare. Cel mai simplu pentru majoritatea cazurilor este utilizarea transient.