Sobes.tech
Junior

Jak vyloučit pole ze serializace v Java?

sobes.tech AI

Odpověď od AI

Existuje několik způsobů, jak vyloučit pole ze serializace:

  1. Použití klíčového slova transient: Nejjednodušší a nejběžnější způsob. Pole označené tímto modifikátorem je ignorováno standardním mechanismem serializace Java.

    public class MyClass implements java.io.Serializable {
        private String essentialField;
        private transient String secretField; // Toto pole nebude serializováno
    
        public MyClass(String essentialField, String secretField) {
            this.essentialField = essentialField;
            this.secretField = secretField;
        }
    
        // Gettery a settery
    }
    
  2. Přepsání metod writeObject a readObject: Umožňuje plnou kontrolu nad procesem serializace a deserializace, určující, která pole se mají uložit (writeObject) a obnovit (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; // Toto pole chceme vyloučit
    
        public MyClass(String fieldToSerialize, String fieldToExclude) {
            this.fieldToSerialize = fieldToSerialize;
            this.fieldToExclude = fieldToExclude;
        }
    
        private void writeObject(ObjectOutputStream out) throws IOException {
            // Serializujeme pouze potřebná pole
            out.defaultWriteObject(); // Serializuje ne-transient, ne-vyloučená pole
            // Pokud jsou pole označená jako transient, ale která je třeba serializovat,
            // nebo pole, která je třeba serializovat specifickým způsobem, lze je serializovat ručně zde
        }
    
        private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
            // Deserializujeme pouze potřebná pole
            in.defaultReadObject(); // Deserializuje ne-transient, ne-vyloučená pole
            // Pokud jsou pole označená jako transient, ale která je třeba deserializovat,
            // lze je deserializovat ručně zde
        }
    
        // Gettery a settery
    }
    
  3. Použití rozhraní Externalizable: Poskytuje úplnou kontrolu nad serializací, vyžadující implementaci metod writeExternal a readExternal. Je to flexibilnější přístup než Serializable, ale vyžaduje více manuální práce.

    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; // Toto pole chceme vyloučit
    
        // Veřejný bezparametrický konstruktor je povinný pro Externalizable
        public MyClass() {
        }
    
        public MyClass(String fieldToSerialize, String fieldToExclude) {
            this.fieldToSerialize = fieldToSerialize;
            this.fieldToExclude = fieldToExclude;
        }
    
        @Override
        public void writeExternal(ObjectOutput out) throws IOException {
            // Jasně uvádíme, co serializujeme
            out.writeObject(fieldToSerialize);
            // fieldToExclude se neserializuje
        }
    
        @Override
        public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
            // Jasně uvádíme, co deserializujeme
            fieldToSerialize = (String) in.readObject();
            // fieldToExclude se nedeserializuje
        }
    
        // Gettery a settery
    }
    

Volba metody závisí na konkrétním úkolu a požadované úrovni kontroly nad procesem serializace. Nejjednodušší pro většinu případů je použití transient.