JAVAPRO_IR Telegram 4441
🎯 سفارشی‌سازی 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
3👍2



tgoop.com/javapro_ir/4441
Create:
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

View MORE
Open in Telegram


Telegram News

Date: |

How to create a business channel on Telegram? (Tutorial) Polls How to Create a Private or Public Channel on Telegram? “[The defendant] could not shift his criminal liability,” Hui said. With Bitcoin down 30% in the past week, some crypto traders have taken to Telegram to “voice” their feelings.
from us


Telegram برنامه نویسی جاوا | Java
FROM American