예전에 네트워크 통신을 할때 Serialize에 대해 공부를 한 경험이 있지만 지식의 부족함을 느끼고 조사하여 결과를 정리합니다.
java.io.Serializable
인터페이스를 상속받은 객체는 직렬화 할 수 있는 기본 조건입니다.public class Member implements Serializable {
private String name;
private String email;
private int age;
public Member(String name, String email, int age) {
this.name = name;
this.email = email;
this.age = age;
}
@Override
public String toString() {
return String.format("Member{name='%s', email='%s', age='%s'}", name, email, age);
}
}
java.io.ObjectOutputStream
를 사용하여 직렬화를 진행합니다.public static void main(String[] args){
Member member = new Member("김배민", "deliverykim@baemin.com", 25);
byte[] serializedMember;
try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) {
try (ObjectOutputStream oos = new ObjectOutputStream(baos)) {
oos.writeObject(member);
// serializedMember -> 직렬화된 member 객체
serializedMember = baos.toByteArray();
}
}
// 바이트 배열로 생성된 직렬화 데이터를 base64로 변환
System.out.println(Base64.getEncoder().encodeToString(serializedMember));
}
serialVersionUID
를 가지고 있어야 합니다.private static final long serialVersionUID = 1L;
serialVersionUID
이 왜 필요한지 자세한 내용은 아래에 추가하였습니다 :)java.io.ObjectInputStream
를 사용하여 역직렬화를 진행합니다.public static void main(String[] args){
// 직렬화 예제에서 생성된 base64 데이터
String base64Member = "...생략";
byte[] serializedMember = Base64.getDecoder().decode(base64Member);
try (ByteArrayInputStream bais = new ByteArrayInputStream(serializedMember)) {
try (ObjectInputStream ois = new ObjectInputStream(bais)) {
// 역직렬화된 Member 객체를 읽어온다.
Object objectMember = ois.readObject();
Member member = (Member) objectMember;
System.out.println(member);
}
}
}
nesoy,youngjaeKwon,Seoul,Korea -> [nesoy, youngjaeKwon, Seoul, Korea]
Member member = new Member("김배민", "deliverykim@baemin.com", 25);
// member객체를 csv로 변환
String csv = String.format("%s,%s,%d",member.getName(), member.getEmail(), member.getAge());
System.out.println(csv);
Member member = new Member("김배민", "deliverykim@baemin.com", 25);
// member객체를 json으로 변환
String json = String.format(
"{\"name\":\"%s\",\"email\":\"%s\",\"age\":%d}",
member.getName(), member.getEmail(), member.getAge());
System.out.println(json);
public class Member implements Serializable {
private String name;
private String email;
private int age;
// 생략
}
rO0ABXNyABp3b293YWhhbi5ibG9nLmV4YW0xLk1lbWJlcgAAAAAAAAABAgAESQADYWdlSQAEYWdlMkwABWVtYWlsdAASTGphdmEvbGFuZy9TdHJpbmc7TAAEbmFtZXEAfgABeHAAAAAZAAAAAHQAFmRlbGl2ZXJ5a2ltQGJhZW1pbi5jb210AAnquYDrsLDrr7w=
public class Member implements Serializable {
private String name;
private String email;
private int age;
// phone 속성을 추가
private String phone;
}
java.io.InvalidClassException
이 발생합니다.SUID(serialVersionUID)
를 정의해야 합니다.String
-> StringBuilder
, int
-> long
으로 변경해도 역직렬화에서 Exception
이 발생합니다.{"name":"김배민","email":"deliverykim@baemin.com","age":25}
serializedMember (byte size = 146)
json (byte size = 62)