Java & Kotlin
java 직렬화(Serialize)
필자A
2021. 10. 20. 15:08
"자바 직렬화"
자바 내부에서 사용되는 객체, 데이터를
외부의 자바 시스템에서 사용할 수 있도록 형태로 바꾸는 것
JVM(heap or stack)안의 데이터 -> byte형태의 자료
타인과 통화를 할때 소리가 데이터로 변환되어
통과하여 받는사람입장에서는
들을 수 있는 소리로 다시 변하는 것으로 생각해도 좋을 것 같습니다.
implements Serializable를 작성하면 됩니다.
serializable은 인터페이스고 아무런 기능도 하지 못합니다.
이 인터페이스를 사용하는 클래스는 JVM에서
직렬화, 역직렬화를 한다고 인식합니다.
Book book = new Book(0, "miss");
byte[] SerializedBook;
try(ByteArrayOutputStream bos = new ByteArrayOutputStream()){
try (ObjectOutputStream oos = new ObjectOutputStream(bos)){
oos.writeObject(book);
SerializedBook = bos.toByteArray();
}
}
Base64.getEncoder().encodeToString(SerializedBook);
book객체를 ObjectStream에 넣은 뒤 다시
byteStream에 넣은뒤 byte []로 받았습니다.
Base64.getEncoder().encodeToString(SerializedBook);
try(ByteArrayInputStream bais = new ByteArrayInputStream(SerializedBook)){
try(ObjectInputStream ois = new ObjectInputStream(bais)){
Object object = ois.readObject();
Book book2 = (Book)object;
System.out.println(book2.toString());
}
}
그 후 다시 byte형태의 데이터를 자바 객체로
변환할 수 있습니다.
문자열 형태(JSON, XML...)
이진 형태
왜 사용할까?
객체를 파일로 저장할 때
저장한 객체를 읽을 때
다른 서버의 데이터를 읽을 때
Serializeble을 사용하는 클래스에
해당 필드를 추가합니다.
해당 필드의 값으로 데이터가 변조되었는지 확인합니다.
값을 임의적으로 넣지 않았을 경우
컴파일 때 해당 필드가 추가됩니다.
private static final long serialVersionUID = -12223L;
public static void read() {
Object object = null;
try(FileInputStream fis = new FileInputStream(path+"/book.md");
ObjectInputStream ois = new ObjectInputStream(fis);){
object = ois.readObject();
}catch (Exception e) {
e.printStackTrace();
}
Book book2 = (Book)object;
System.out.println(book2);
}
public static void save(Book book) {
try(FileOutputStream fos = new FileOutputStream(path+"/book.md");
ObjectOutputStream oos = new ObjectOutputStream(fos);){
oos.writeObject(book);
}catch (Exception e) {
e.printStackTrace();
}
}
save()를 호출한 후
read()를 이용하여 파일을 읽어오기 전에
클래스의 UID값을 변경한 후
read()를 호출하면
java.io.InvalidClassException: Book; local class incompatible:
해당 예외가 발생합니다.
반응형