Sobes.tech
Junior

Hogyan zárhatunk ki mezőket a Java serializációból?

sobes.tech MI

Válasz az MI-től

Számos módja van annak, hogy kizárjunk mezőket a sorosításból:

  1. A transient kulcsszó használata: A legegyszerűbb és leggyakoribb módszer. Ezzel a módosítóval ellátott mezőt a Java szabványos sorosítási mechanizmusa figyelmen kívül hagyja.

    public class MyClass implements java.io.Serializable {
        private String essentialField;
        private transient String secretField; // Ez a mező nem lesz sorosítva
    
        public MyClass(String essentialField, String secretField) {
            this.essentialField = essentialField;
            this.secretField = secretField;
        }
    
        // Getterek és setterek
    }
    
  2. A writeObject és readObject metódusok felülírása: Teljes kontrollt ad a sorosítási és deszerializációs folyamat felett, meghatározva, mely mezőket mentjük (a writeObject-ben) és állítjuk vissza (a readObject-ben).

    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; // Ezt a mezőt ki akarjuk zárni
    
        public MyClass(String fieldToSerialize, String fieldToExclude) {
            this.fieldToSerialize = fieldToSerialize;
            this.fieldToExclude = fieldToExclude;
        }
    
        private void writeObject(ObjectOutputStream out) throws IOException {
            // Csak a szükséges mezőket sorosítjuk
            out.defaultWriteObject(); // A nem-transient, nem kizárt mezőket sorosítja
            // Ha vannak transient jelölésű, de sorosítani kívánt mezők,
            // vagy speciális módon sorosítandó mezők, azokat itt lehet manuálisan sorosítani
        }
    
        private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
            // Csak a szükséges mezőket deszerializáljuk
            in.defaultReadObject(); // A nem-transient, nem kizárt mezőket deszerializálja
            // Ha vannak transient jelölésű, de deszerializálandó mezők,
            // azokat itt lehet manuálisan deszerializálni
        }
    
        // Getterek és setterek
    }
    
  3. Az Externalizable interfész használata: Teljes kontrollt ad a sorosítás felett, megkövetelve az writeExternal és readExternal metódusok implementálását. Ez rugalmasabb megközelítés, mint a Serializable, de több kézi kezelést igényel.

    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; // Ezt a mezőt ki akarjuk zárni
    
        // Nyilvános, paraméter nélküli konstruktor kötelező az Externalizable-hez
        public MyClass() {
        }
    
        public MyClass(String fieldToSerialize, String fieldToExclude) {
            this.fieldToSerialize = fieldToSerialize;
            this.fieldToExclude = fieldToExclude;
        }
    
        @Override
        public void writeExternal(ObjectOutput out) throws IOException {
            // Egyértelműen megadjuk, mit sorosítunk
            out.writeObject(fieldToSerialize);
            // fieldToExclude nem kerül sorosításra
        }
    
        @Override
        public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
            // Egyértelműen megadjuk, mit deszerializálunk
            fieldToSerialize = (String) in.readObject();
            // fieldToExclude nem deszerializálódik
        }
    
        // Getterek és setterek
    }
    

A módszer kiválasztása a konkrét feladattól és a sorosítási folyamat feletti kontroll szintjétől függ. A legtöbb esetben a transient használata a legegyszerűbb.