Hogyan zárhatunk ki mezőket a Java serializációból?
sobes.tech MI
Válasz az MI-től
Számos módja van annak, hogy kizárjunk mezőket a sorosításból:
-
A
transientkulcsszó használata: A legegyszerűbb és leggyakoribb módszer. Ezzel a módosítóval ellátott mezőt a Java szabványos sorosítási mechanizmusa figyelmen kívül hagyja.public class MyClass implements java.io.Serializable { private String essentialField; private transient String secretField; // Ez a mező nem lesz sorosítva public MyClass(String essentialField, String secretField) { this.essentialField = essentialField; this.secretField = secretField; } // Getterek és setterek } -
A
writeObjectésreadObjectmetódusok felülírása: Teljes kontrollt ad a sorosítási és deszerializációs folyamat felett, meghatározva, mely mezőket mentjük (awriteObject-ben) és állítjuk vissza (areadObject-ben).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; // Ezt a mezőt ki akarjuk zárni public MyClass(String fieldToSerialize, String fieldToExclude) { this.fieldToSerialize = fieldToSerialize; this.fieldToExclude = fieldToExclude; } private void writeObject(ObjectOutputStream out) throws IOException { // Csak a szükséges mezőket sorosítjuk out.defaultWriteObject(); // A nem-transient, nem kizárt mezőket sorosítja // Ha vannak transient jelölésű, de sorosítani kívánt mezők, // vagy speciális módon sorosítandó mezők, azokat itt lehet manuálisan sorosítani } private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { // Csak a szükséges mezőket deszerializáljuk in.defaultReadObject(); // A nem-transient, nem kizárt mezőket deszerializálja // Ha vannak transient jelölésű, de deszerializálandó mezők, // azokat itt lehet manuálisan deszerializálni } // Getterek és setterek } -
Az
Externalizableinterfész használata: Teljes kontrollt ad a sorosítás felett, megkövetelve azwriteExternalésreadExternalmetódusok implementálását. Ez rugalmasabb megközelítés, mint aSerializable, de több kézi kezelést igényel.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; // Ezt a mezőt ki akarjuk zárni // Nyilvános, paraméter nélküli konstruktor kötelező az Externalizable-hez public MyClass() { } public MyClass(String fieldToSerialize, String fieldToExclude) { this.fieldToSerialize = fieldToSerialize; this.fieldToExclude = fieldToExclude; } @Override public void writeExternal(ObjectOutput out) throws IOException { // Egyértelműen megadjuk, mit sorosítunk out.writeObject(fieldToSerialize); // fieldToExclude nem kerül sorosításra } @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException { // Egyértelműen megadjuk, mit deszerializálunk fieldToSerialize = (String) in.readObject(); // fieldToExclude nem deszerializálódik } // Getterek és setterek }
A módszer kiválasztása a konkrét feladattól és a sorosítási folyamat feletti kontroll szintjétől függ. A legtöbb esetben a transient használata a legegyszerűbb.