Sobes.tech
Junior

Ինչպես բացառել դաշտերը սերիալիզացիայից Java-ում?

sobes.tech AI

Պատասխան AI-ից

Կան մի քանի եղանակներ դաշտերը բացառելու համար սերիալիզացիայից:

  1. Բոլորից պարզ և տարածված միջոցը 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;
        }
    
        // Գеттерներ և սեթերներ
    }
    
  2. 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 դաշտեր, որոնք պետք է դեսերիալիզացնել, 
            // դրանք կարելի է դեսերիալիզացնել այստեղ
        }
    
        // Գеттерներ և սեթերներ
    }
    
  3. 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 օգտագործելն է շատ դեպքերում։