Kako isključiti polja iz serializacije u Javi?
sobes.tech АИ
Одговор од АИ
Postoji nekoliko načina da isključite polja iz serializacije:
-
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 } -
Prepisivanje metoda
writeObjectireadObject: 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 } -
Korišćenje interfejsa
Externalizable: Omogućava potpunu kontrolu nad serializacijom, zahtevajući implementaciju metodawriteExternalireadExternal. Ovo je fleksibilniji pristup odSerializable, 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.