Junior
Ինչպես բացառել դաշտերը սերիալիզացիայից 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; } // Գеттерներ և սեթերներ } -
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 դաշտեր, որոնք պետք է դեսերիալիզացնել, // դրանք կարելի է դեսերիալիզացնել այստեղ } // Գеттерներ և սեթերներ } -
Externalizableինտերֆեյսի օգտագործում: Սա տալիս է լրացուցիչ վերահսկողություն սերիալիզացիայի վրա՝ պահանջելովwriteExternalևreadExternalմեթոդների իրականացմանը: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; // Այս դաշտը ուզում ենք բացառել // Պահանջվում է բացասական կոնստրուկտոր՝ առանց պարամետրերի 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 չի դեսերիալիզացվում } // Գеттерներ և սեթերներ }
Ընտրությունը կախված է կոնկրետ խնդիրից և անհրաժեշտ վերահսկողության մակարդակից սերիալիզացիայի գործընթացում: Ամենահեշտը transient օգտագործելն է շատ դեպքերում։