Sobes.tech
Junior

Kako isključiti polja iz serializacije u Javi?

sobes.tech АИ

Одговор од АИ

Postoji nekoliko načina da isključite polja iz serializacije:

  1. Korišćenje ključne reči transient: Najjednostavniji i najčešće korišćen način. Polje označeno ovim modifikatorom se ignoriše od strane standardnog mehanizma serializacije Java.

    public class MyClass implements java.io.Serializable {
        private String essentialField;
        private transient String secretField; // Ovo polje neće biti serializovano
    
        public MyClass(String essentialField, String secretField) {
            this.essentialField = essentialField;
            this.secretField = secretField;
        }
    
        // Getteri i setteri
    }
    
  2. Prepisivanje metoda writeObject i readObject: Omogućava potpunu kontrolu nad procesom serializacije i deserializacije, određujući koja polja da se sačuvaju (writeObject) i povrate (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; // Ovo polje želimo da isključimo
    
        public MyClass(String fieldToSerialize, String fieldToExclude) {
            this.fieldToSerialize = fieldToSerialize;
            this.fieldToExclude = fieldToExclude;
        }
    
        private void writeObject(ObjectOutputStream out) throws IOException {
            // Serijalizujemo samo potrebna polja
            out.defaultWriteObject(); // Serijalizuje ne-transient, ne-izuzeta polja
            // Ako postoje polja označena kao transient ali koja treba da se serijalizuju,
            // ili polja koja treba serijalizovati na specifičan način, mogu se ručno serijalizovati ovde
        }
    
        private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
            // Deserijalizujemo samo potrebna polja
            in.defaultReadObject(); // Deserijalizuje ne-transient, ne-izuzeta polja
            // Ako postoje polja označena kao transient ali koja treba da se deserializuju,
            // mogu se ručno deserializovati ovde
        }
    
        // Getteri i setteri
    }
    
  3. Korišćenje interfejsa Externalizable: Omogućava potpunu kontrolu nad serializacijom, zahtevajući implementaciju metoda writeExternal i readExternal. Ovo je fleksibilniji pristup od Serializable, ali zahteva više ručnog upravljanja.

    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; // Ovo polje želimo da isključimo
    
        // Obavezan javni konstruktor bez argumenata za Externalizable
        public MyClass() {
        }
    
        public MyClass(String fieldToSerialize, String fieldToExclude) {
            this.fieldToSerialize = fieldToSerialize;
            this.fieldToExclude = fieldToExclude;
        }
    
        @Override
        public void writeExternal(ObjectOutput out) throws IOException {
            // Jasno navodimo šta serijalizujemo
            out.writeObject(fieldToSerialize);
            // fieldToExclude se ne serijalizuje
        }
    
        @Override
        public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
            // Jasno navodimo šta deserializujemo
            fieldToSerialize = (String) in.readObject();
            // fieldToExclude se ne deserializuje
        }
    
        // Getteri i setteri
    }
    

Izbor metode zavisi od konkretne zadatka i nivoa kontrole nad procesom serializacije. Za većinu slučajeva najjednostavnije je korišćenje transient.