tgoop.com/javapro_ir/4441
Create:
Last Update:
Last Update:
🎯 سفارشیسازی Serialization در جاوا
بهطور پیشفرض، وقتی کلاسی Serializable باشه، تمام فیلدهای غیر transient بهصورت خودکار Serialize میشن.
اما بعضی وقتا لازم داریم رفتار رو خودمون تغییر بدیم. برای این کار میتونیم در کلاس متدهای خصوصی (private) زیر رو پیادهسازی کنیم:
private void writeObject(ObjectOutputStream out) throws IOException
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException
جاوا این متدها رو بهصورت خودکار در زمان writeObject و readObject صدا میزنه.
📌 مثال: رمزنگاری پسورد هنگام Serialization
فرض کنید یک کلاس کاربر دارید که فیلد password داره. نمیخواید پسورد بهصورت متن ساده ذخیره بشه. میخواید هنگام ذخیره، رمزنگاری بشه و هنگام بازیابی، رمزگشایی بشه.
import java.io.*;
class User implements Serializable {
private String username;
private transient String password; // ذخیره مستقیم نمیشود ❌
public User(String username, String password) {
this.username = username;
this.password = password;
}
private void writeObject(ObjectOutputStream out) throws IOException {
out.defaultWriteObject(); // فیلدهای عادی رو ذخیره کن
String encryptedPassword = "ENC(" + password + ")";
out.writeObject(encryptedPassword); // رمزنگاری ساده (نمونه آموزشی)
}
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
in.defaultReadObject(); // فیلدهای عادی رو بخون
String encryptedPassword = (String) in.readObject();
this.password = encryptedPassword.replace("ENC(", "").replace(")", ""); // رمزگشایی ساده
}
@Override
public String toString() {
return "User{username='" + username + "', password='" + password + "'}";
}
}
public class Main {
public static void main(String[] args) throws Exception {
User user = new User("Saleh", "12345");
// Serialize
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("user.ser"));
oos.writeObject(user);
oos.close();
// Deserialize
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("user.ser"));
User deserializedUser = (User) ois.readObject();
ois.close();
System.out.println("بعد از Deserialize:");
System.out.println(deserializedUser);
}
}
✅ نکات مهم
1. متدهای writeObject و readObject باید private باشن.
2. متد defaultWriteObject و defaultReadObject کار Serialization پیشفرض رو انجام میدن.
3. با این تکنیک میتونیم:
* دادهها رو رمزنگاری/رمزگشایی کنیم.
* دادههای محاسباتی رو بازسازی کنیم.
* فیلدهای transient رو به شکل خاصی ذخیره کنیم.
#کاربرـحرفهـای
🆔 @javapro_ir
🆔 @group_javapro
BY برنامه نویسی جاوا | Java
Share with your friend now:
tgoop.com/javapro_ir/4441