Sobes.tech
Junior

Java'da maydonlarni serializatsiyadan qanday chiqarish mumkin?

sobes.tech AI

AIdan javob

Serializatsiyadan maydonlarni chiqarib tashlashning bir nechta usullari mavjud:

  1. transient kalit so'zidan foydalanish: Eng oddiy va keng tarqalgan usul. Bu modifikator bilan belgilangan maydon Java ning standart serializatsiya mexanizmi tomonidan e'tiborga olinmaydi.

    public class MyClass implements java.io.Serializable {
        private String essentialField;
        private transient String secretField; // Bu maydon serializatsiya qilinmaydi
    
        public MyClass(String essentialField, String secretField) {
            this.essentialField = essentialField;
            this.secretField = secretField;
        }
    
        // Getter va setterlar
    }
    
  2. writeObject va readObject metodlarini qayta yozish: Bu usul serializatsiya va deserializatsiya jarayonini to'liq nazorat qilish imkonini beradi, qaysi maydonlarni saqlash ( writeObject da) va tiklash ( readObject da) ni belgilash.

    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; // Bu maydonni chiqarib tashlamoqchimiz
    
        public MyClass(String fieldToSerialize, String fieldToExclude) {
            this.fieldToSerialize = fieldToSerialize;
            this.fieldToExclude = fieldToExclude;
        }
    
        private void writeObject(ObjectOutputStream out) throws IOException {
            // Faqat kerakli maydonlarni serializatsiya qilamiz
            out.defaultWriteObject(); // Transient bo'lmagan va qo'lda chiqarib tashlanmagan maydonlarni serializatsiya qiladi
            // Agar transient belgilangan maydonlar bo'lsa, lekin serializatsiya qilinishi kerak bo'lsa,
            // yoki maxsus tarzda serializatsiya qilinishi kerak bo'lgan maydonlar,
            // ularni qo'lda serializatsiya qilish mumkin
        }
    
        private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
            // Faqat kerakli maydonlarni deserializatsiya qilamiz
            in.defaultReadObject(); // Transient bo'lmagan va qo'lda chiqarib tashlanmagan maydonlarni deserializatsiya qiladi
            // Agar transient belgilangan maydonlar bo'lsa, lekin deserializatsiya qilinishi kerak bo'lsa,
            // ularni qo'lda deserializatsiya qilish mumkin
        }
    
        // Getter va setterlar
    }
    
  3. Externalizable interfeysidan foydalanish: Bu serializatsiya ustidan to'liq nazoratni ta'minlaydi, writeExternal va readExternal metodlarini amalga oshirishni talab qiladi. Bu Serializable ga nisbatan ko'proq moslashuvchan yondashuv, lekin ko'proq qo'lda boshqarishni talab qiladi.

    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; // Bu maydonni chiqarib tashlamoqchimiz
    
        // Externalizable uchun ochiq konstruktor talab qilinadi
        public MyClass() {
        }
    
        public MyClass(String fieldToSerialize, String fieldToExclude) {
            this.fieldToSerialize = fieldToSerialize;
            this.fieldToExclude = fieldToExclude;
        }
    
        @Override
        public void writeExternal(ObjectOutput out) throws IOException {
            // Aniq belgilaymiz, nima serializatsiya qilinadi
            out.writeObject(fieldToSerialize);
            // fieldToExclude serializatsiya qilinmaydi
        }
    
        @Override
        public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
            // Aniq belgilaymiz, nima deserializatsiya qilinadi
            fieldToSerialize = (String) in.readObject();
            // fieldToExclude deserializatsiya qilinmaydi
        }
    
        // Getter va setterlar
    }
    

Qaysi usul tanlanishi, vazifa va serializatsiya jarayoniga bo'lgan nazorat darajasiga bog'liq. Ko'p hollarda, transient dan foydalanish eng oddiy variant hisoblanadi.