Java'da maydonlarni serializatsiyadan qanday chiqarish mumkin?
sobes.tech AI
AIdan javob
Serializatsiyadan maydonlarni chiqarib tashlashning bir nechta usullari mavjud:
-
transientkalit 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 } -
writeObjectvareadObjectmetodlarini qayta yozish: Bu usul serializatsiya va deserializatsiya jarayonini to'liq nazorat qilish imkonini beradi, qaysi maydonlarni saqlash (writeObjectda) va tiklash (readObjectda) 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 } -
Externalizableinterfeysidan foydalanish: Bu serializatsiya ustidan to'liq nazoratni ta'minlaydi,writeExternalvareadExternalmetodlarini amalga oshirishni talab qiladi. BuSerializablega 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.