선릉역 1번 출구

JAVA 객체 직렬화 본문

Language/Java

JAVA 객체 직렬화

choideu 2023. 1. 7. 02:56

보안 위협 중 JAVA Deserialization 관련 부분이 많음

 

자바: 메모리에 생성된 객체를 파일 또는 네트워크로 출력할 수 있음, 그러나 객체는 문자가 아니기 때문에 바이트 기반 스트림으로 출력해야 함

 

객체를 출력하기 위해서는 객체의 데이터를 일렬로 늘어선 연속적인 바이트로 변경해야 함 -> 객체 직렬화

 

반대로 파일에 저장되어 있거나, 네트워크에서 전송된 객체를 읽는 것 = 입력 스트림으로부터 읽어들인 연속적인 바이트를 객체로 복원하는 것은 역직렬화임

 

ObjectOutputStream: 바이트 출력 스트림과 연결되어 객체를 직렬화하는 역할

ObjectInputStream: 바이트 입력 스트림과 연결되어 객체로 역직렬화하는 역할

 

직렬화가 가능한 클래스(Serializable)

- 자바는 Serializable 인터페이스를 구현한 클래스만 직렬화할 수 있도록 제한함

- static이나 transient는 직렬화의 대상에서 제외됨

- 직렬화된 객체를 역직렬화할 때는 직렬화했을 때와 같은 클래스를 사용해야 함

FileInputStream fis = new FIleInputStream("C:/Temp/Object.dat");
ObjectInputStream ois = new ObjectInputStream(fis);
(직렬화한 클래스) v = (직렬화한 클래스) ois.readObject();
ex) ClassA v = (ClassA) ois.readObject();

if) 같은 클래스를 사용하지 않는다면, 클래스 식별자의 역할을 하는 serialVersionUID가 달라 예외가 발생함

*Serializable 인터페이스를 구현한 클래스를 컴파일하면 자동적으로 serialVersionUID 정적 필드가 추가됨

*역직렬화시 직렬화한 순서 그대로 출력됨!!

 

 

 

참고 사이트

https://flowarc.tistory.com/entry/Java-%EA%B0%9D%EC%B2%B4-%EC%A7%81%EB%A0%AC%ED%99%94Serialization-%EC%99%80-%EC%97%AD%EC%A7%81%EB%A0%AC%ED%99%94Deserialization

'Language > Java' 카테고리의 다른 글

JAVA(1)  (0) 2023.01.12
java memory allocation  (0) 2023.01.12
toString  (0) 2022.12.31
생성자  (0) 2022.12.30
getter and setter  (0) 2022.12.30
Comments