Sobes.tech
Junior

Πώς εξαιρούμε πεδία από την σειριοποίηση σε Java;

sobes.tech AI

Απάντηση από AI

Υπάρχουν διάφοροι τρόποι για να εξαιρέσετε πεδία από τη σειριοποίηση:

  1. Χρήση της λέξης-κλειδιού transient: Ο πιο απλός και συνηθισμένος τρόπος. Το πεδίο που σημειώνεται με αυτόν τον τροποποιητή αγνοείται από τον μηχανισμό σειριοποίησης της Java.

    public class MyClass implements java.io.Serializable {
        private String essentialField;
        private transient String secretField; // Αυτό το πεδίο δεν θα σειριοποιηθεί
    
        public MyClass(String essentialField, String secretField) {
            this.essentialField = essentialField;
            this.secretField = secretField;
        }
    
        // Getters και setters
    }
    
  2. Υπερφόρτωση των μεθόδων writeObject και readObject: Επιτρέπει πλήρη έλεγχο της διαδικασίας σειριοποίησης και αποσειριοποίησης, καθορίζοντας ποια πεδία θα αποθηκεύονται (writeObject) και θα ανακτώνται (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; // Αυτό το πεδίο θέλουμε να εξαιρέσουμε
    
        public MyClass(String fieldToSerialize, String fieldToExclude) {
            this.fieldToSerialize = fieldToSerialize;
            this.fieldToExclude = fieldToExclude;
        }
    
        private void writeObject(ObjectOutputStream out) throws IOException {
            // Σειριοποιούμε μόνο τα απαραίτητα πεδία
            out.defaultWriteObject(); // Σειριοποιεί τα μη-transient, μη-εξαίρετα πεδία
            // Αν υπάρχουν πεδία που σημειώνονται ως transient αλλά πρέπει να σειριοποιηθούν,
            // ή πεδία που πρέπει να σειριοποιηθούν με συγκεκριμένο τρόπο,
            // μπορούν να σειριοποιηθούν χειροκίνητα εδώ
        }
    
        private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
            // Αποσειριοποιούμε μόνο τα απαραίτητα πεδία
            in.defaultReadObject(); // Αποσειριοποιεί τα μη-transient, μη-εξαίρετα πεδία
            // Αν υπάρχουν πεδία που σημειώνονται ως transient αλλά πρέπει να αποσειριοποιηθούν,
            // μπορούν να αποσειριοποιηθούν χειροκίνητα εδώ
        }
    
        // Getters και setters
    }
    
  3. Χρήση της διεπαφής Externalizable: Παρέχει πλήρη έλεγχο στη σειριοποίηση, απαιτώντας την υλοποίηση των μεθόδων writeExternal και readExternal. Αυτή η προσέγγιση είναι πιο ευέλικτη από το Serializable, αλλά απαιτεί περισσότερο χειρισμό χειροκίνητα.

    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; // Αυτό το πεδίο θέλουμε να εξαιρέσουμε
    
        // Απαιτείται δημόσιος και κενός κατασκευαστής για Externalizable
        public MyClass() {
        }
    
        public MyClass(String fieldToSerialize, String fieldToExclude) {
            this.fieldToSerialize = fieldToSerialize;
            this.fieldToExclude = fieldToExclude;
        }
    
        @Override
        public void writeExternal(ObjectOutput out) throws IOException {
            // Ρητά δηλώνουμε τι σειριοποιούμε
            out.writeObject(fieldToSerialize);
            // fieldToExclude δεν σειριοποιείται
        }
    
        @Override
        public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
            // Ρητά δηλώνουμε τι αποσειριοποιούμε
            fieldToSerialize = (String) in.readObject();
            // fieldToExclude δεν αποσειριοποιείται
        }
    
        // Getters και setters
    }
    

Η επιλογή της μεθόδου εξαρτάται από την συγκεκριμένη εργασία και το επίπεδο ελέγχου που απαιτείται στη διαδικασία σειριοποίησης. Το πιο απλό για τις περισσότερες περιπτώσεις είναι η χρήση του transient.