Πώς εξαιρούμε πεδία από την σειριοποίηση σε Java;
sobes.tech AI
Απάντηση από AI
Υπάρχουν διάφοροι τρόποι για να εξαιρέσετε πεδία από τη σειριοποίηση:
-
Χρήση της λέξης-κλειδιού
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 } -
Υπερφόρτωση των μεθόδων
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 } -
Χρήση της διεπαφής
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.