직렬화(Serialization)는 객체의 상태를 저장하거나 다른 시스템에 전달할 수 있도록, 객체를 바이트 형태로 변환하는 과정입니다. 이를 통해 객체 데이터를 파일로 저장하거나 네트워크를 통해 전송할 수 있습니다.
반대로, 저장된 데이터를 다시 객체로 복원하는 과정을 역직렬화(Deserialization)라고 합니다.
Serializable 인터페이스를 구현해야 합니다.ObjectOutputStream과 ObjectInputStream을 사용합니다.public boolean saveToSerial() {
boolean flag = false;
ObjectOutputStream oos = null;
try {
oos = new ObjectOutputStream(new FileOutputStream("./serial.txt"));
oos.writeObject(ary); // 직렬화 대상 객체를 저장
flag = true;
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (oos != null) {
oos.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
return flag;
}
public boolean loadToSerial() {
boolean flag = false;
ObjectInputStream ois = null;
try {
ois = new ObjectInputStream(new FileInputStream("./serial.txt"));
ary = (PersonVO[]) ois.readObject(); // 저장된 객체를 불러와 배열로 캐스팅
flag = true;
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (ois != null) {
ois.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
return flag;
}
프론트엔드에서 사용자의 데이터를 저장하거나 불러오는 기능을 구현할 때, 직렬화 및 역직렬화를 활용할 수 있습니다. 아래는 간단한 시나리오입니다.
case 99:
System.out.print("데이터를 저장하시겠습니까? (y/n)");
String ynFlag = scan.nextLine();
if (ynFlag.equalsIgnoreCase("y")) {
boolean result = backend.saveToSerial();
System.out.println(result ? "데이터 저장 성공" : "데이터 저장 실패");
} else {
System.out.println("파일 저장 없이 종료합니다.");
}
System.exit(0);
String msg = backend.loadToSerial() ? "데이터 로딩 성공" : "데이터 로딩 실패";
System.out.println(msg);
Serializable 구현
직렬화하려는 객체는 반드시 Serializable 인터페이스를 구현해야합니다.
// 예시
public class PersonVO implements Serializable {
private String name;
private int age;
// Getter/Setter
}
직렬화 파일 보안
직렬화된 데이터는 사람이 읽을 수 없는 형식으로 저장됩니다. 민감한 데이터를 다룰 경우 암호화 등의 추가 보안 조치가 필요합니다.
버전 관리
클래스에 변경 사항이 있을 경우 serialVersionUID를 명시적으로 선언하여 직렬화 파일의 호환성을 유지해야 합니다.
직렬화는 객체 데이터를 간단하고 효율적으로 저장하거나 전달할 수 있도록 돕는 도구입니다.
특히 파일 입출력 방식보다 효율적이며, 네트워크를 통한 데이터 송수신에도 적합합니다. 그러나 보안과 호환성을 고려하여 신중히 사용해야 합니다.
이 글이 직렬화를 이해하고 활용하는 데 도움이 되었길 바랍니다! 😊
부족한 부분이있다면 언제든지 말씀해주세요!!