Kā izslēgt laukus no serializācijas Java?
sobes.tech AI
Atbilde no AI
Ir vairākas veidi, kā izslēgt laukus no serializācijas:
-
Izmantojot atslēgvārdu
transient: Tas ir vienkāršākais un biežāk izmantotais veids. Ar šo atslēgvārdu atzīmētais lauks tiks ignorēts Java standarta serializācijas mehānisma laikā:public class MyClass implements java.io.Serializable { private String essentialField; private transient String secretField; // Šis lauks netiks serializēts public MyClass(String essentialField, String secretField) { this.essentialField = essentialField; this.secretField = secretField; } // Ggetteri un sgetteri } -
writeObjectunreadObjectmetožu pārrakstīšana: Tas ļauj pilnībā kontrolēt serializācijas un deserializācijas procesu, noteikt, kurus laukus saglabāt un atjaunot: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; // Šo lauku vēlamies izslēgt public MyClass(String fieldToSerialize, String fieldToExclude) { this.fieldToSerialize = fieldToSerialize; this.fieldToExclude = fieldToExclude; } private void writeObject(ObjectOutputStream out) throws IOException { // Saglabājam tikai nepieciešamos laukus out.defaultWriteObject(); // Saglabā ne-transient, neizslēgtos laukus // Ja ir transient lauki, kurus vēlaties saglabāt, vai laukus, kurus nepieciešams serializēt īpašā veidā, tos var serializēt šeit } private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { // Atjaunojam tikai nepieciešamos laukus in.defaultReadObject(); // Atjauno ne-transient, neizslēgtos laukus // Ja ir transient lauki, kurus nepieciešams atjaunot, tos var atjaunot šeit } // Ggetteri un sgetteri } -
Izmantojot
Externalizableinterfeisu: Tas nodrošina pilnu kontroli pār serializāciju, prasotwriteExternalunreadExternalmetožu īstenošanu. Tas ir elastīgāks pieejas veids nekāSerializable, bet prasa vairāk manuālas pārvaldības: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; // Šo lauku vēlamies izslēgt // Obligāts publisks bezparametru konstruktors public MyClass() { } public MyClass(String fieldToSerialize, String fieldToExclude) { this.fieldToSerialize = fieldToSerialize; this.fieldToExclude = fieldToExclude; } @Override public void writeExternal(ObjectOutput out) throws IOException { // Skaidri norādām, ko serializēt out.writeObject(fieldToSerialize); // fieldToExclude netiek serializēts } @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException { // Skaidri norādām, ko deserializēt fieldToSerialize = (String) in.readObject(); // fieldToExclude netiek deserializēts } // Ggetteri un sgetteri }
Izvēle ir atkarīga no konkrētās uzdevuma un nepieciešamā kontroles līmeņa pār serializācijas procesu. Visvienkāršākais veids lielākajā daļā gadījumu ir izmantot transient.