Sobes.tech
Junior

Kuidas välistada väljad Java serialiseerimisel?

sobes.tech AI

Vastus AI-lt

On mitmeid viise, kuidas välistada väljad serialiseerimisest:

  1. Kasutades võtmesõna transient: See on kõige lihtsam ja levinum viis. Selle märgisega märgitud väli ignoreeritakse Java standardse serialiseerimismehhanismi poolt:

    public class MyClass implements java.io.Serializable {
        private String essentialField;
        private transient String secretField; // See väli ei serialiseerita
    
        public MyClass(String essentialField, String secretField) {
            this.essentialField = essentialField;
            this.secretField = secretField;
        }
    
        // Getterid ja setterid
    }
    
  2. writeObject ja readObject meetodite üle kirjutamine: See võimaldab täielikult kontrollida serialiseerimis- ja deserialiseerimisprotsessi, määrates, millised väljad salvestada ja taastada:

    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; // Selle välja tahame välja jätta
    
        public MyClass(String fieldToSerialize, String fieldToExclude) {
            this.fieldToSerialize = fieldToSerialize;
            this.fieldToExclude = fieldToExclude;
        }
    
        private void writeObject(ObjectOutputStream out) throws IOException {
            // Salvestame ainult vajalikud väljad
            out.defaultWriteObject(); // Salvestab mitte-transient, mitte välja jäetud väljad
            // Kui on transient väljad, mida soovite salvestada, või väljad, mida tuleb spetsiifiliselt serialiseerida, saab neid siin serialiseerida
        }
    
        private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
            // Taastame ainult vajalikud väljad
            in.defaultReadObject(); // Taastab mitte-transient, mitte välja jäetud väljad
            // Kui on transient väljad, mida tuleb deserialiseerida, saab neid siin deserialiseerida
        }
    
        // Getterid ja setterid
    }
    
  3. Kasutades Externalizable liidest: See annab täieliku kontrolli serialiseerimise üle, nõudes writeExternal ja readExternal meetodite realiseerimist. See on paindlikum lähenemine kui Serializable, kuid nõuab rohkem käsitsi juhtimist:

    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; // Selle välja tahame välja jätta
    
        // Nõutav avalik konstruktor ilma argumentideta
        public MyClass() {
        }
    
        public MyClass(String fieldToSerialize, String fieldToExclude) {
            this.fieldToSerialize = fieldToSerialize;
            this.fieldToExclude = fieldToExclude;
        }
    
        @Override
        public void writeExternal(ObjectOutput out) throws IOException {
            // Selgelt näitame, mida serialiseerida
            out.writeObject(fieldToSerialize);
            // fieldToExclude ei serialiseerita
        }
    
        @Override
        public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
            // Selgelt näitame, mida deserialiseerida
            fieldToSerialize = (String) in.readObject();
            // fieldToExclude ei deserialiseerita
        }
    
        // Getterid ja setterid
    }
    

Valik sõltub konkreetse ülesande ja serialiseerimisprotsessi kontrolli tasemest. Enamikul juhtudel on kõige lihtsam kasutada transient.