Sobes.tech
Junior

Ako vylúčiť polia zo serializácie v Jave?

sobes.tech AI

Odpoveď od AI

Existuje niekoľko spôsobov, ako vylúčiť polia zo serializácie:

  1. Použitie kľúčového slova transient: Najjednoduchší a najbežnejší spôsob. Pole označené týmto modifikátorom je ignorované štandardným mechanizmom serializácie Java.

    public class MyClass implements java.io.Serializable {
        private String essentialField;
        private transient String secretField; // Toto pole nebude serializované
    
        public MyClass(String essentialField, String secretField) {
            this.essentialField = essentialField;
            this.secretField = secretField;
        }
    
        // Gettery a settery
    }
    
  2. Prepisovanie metód writeObject a readObject: Umožňuje úplnú kontrolu nad procesom serializácie a deserializácie, určujúc, ktoré polia sa majú uložiť (writeObject) a obnoviť (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 vylúčiť
    
        public MyClass(String fieldToSerialize, String fieldToExclude) {
            this.fieldToSerialize = fieldToSerialize;
            this.fieldToExclude = fieldToExclude;
        }
    
        private void writeObject(ObjectOutputStream out) throws IOException {
            // Serializujeme iba potrebné polia
            out.defaultWriteObject(); // Serializuje ne-transient, ne-vylúčené polia
            // Ak existujú polia označené ako transient, ale ktoré je potrebné serializovať,
            // alebo polia, ktoré je potrebné serializovať špecifickým spôsobom, môžu byť serializované ručne tu
        }
    
        private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
            // Deserializujeme iba potrebné polia
            in.defaultReadObject(); // Deserializuje ne-transient, ne-vylúčené polia
            // Ak existujú polia označené ako transient, ale ktoré je potrebné deserializovať,
            // môžu byť deserializované ručne tu
        }
    
        // Gettery a settery
    }
    
  3. Použitie rozhrania Externalizable: Poskytuje úplnú kontrolu nad serializáciou, vyžadujúc implementáciu metód writeExternal a readExternal. Je to flexibilnejší prístup ako Serializable, ale vyžaduje viac manuálnej 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 vylúčiť
    
        // Verejný bezparametrický konštruktor je povinný pre Externalizable
        public MyClass() {
        }
    
        public MyClass(String fieldToSerialize, String fieldToExclude) {
            this.fieldToSerialize = fieldToSerialize;
            this.fieldToExclude = fieldToExclude;
        }
    
        @Override
        public void writeExternal(ObjectOutput out) throws IOException {
            // Jasne uvádzame, čo serializujeme
            out.writeObject(fieldToSerialize);
            // fieldToExclude sa neserializuje
        }
    
        @Override
        public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
            // Jasne uvádzame, čo deserializujeme
            fieldToSerialize = (String) in.readObject();
            // fieldToExclude sa nedeserializuje
        }
    
        // Gettery a settery
    }
    

Výber metódy závisí od konkrétneho úlohy a požadovanej úrovne kontroly nad procesom serializácie. Najjednoduchším pre väčšinu prípadov je použitie transient.