Чӣ тавр майдонҳоро аз сериализатсия дар 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: Имкон медиҳад, ки назорати пурра дар равандҳои сериализатсия ва десериализатсия, муайян кардани кадом майдонҳоро нигоҳ медоранд (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; // Ин майдонро мехоҳем хориҷ кунем // Конструктори умумӣ ва бе аргументҳо барои Externalizable зарур аст 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 соддатар аст.