728x90
반응형
Serialization
- 직렬화란 객체를 데이터 스트림으로 만드는 것을 말한다.
- 역직렬화란 스트림으로부터 데이터를 읽어서 객체를 만드는 것을 말한다.
- 객체를 바이트로 만들어 저장 하고 바이트로된 데이터를 읽어서 객체로 만든다.
왜 필요할까?
- 객체를 따로 저장했다가 읽을때 사용한다.
- 네트웍을 통해 컴퓨터 간에 서로 객체를 주고 받을때 사용한다.
serialVersionUID
serialVersionUID 를 쓰는경우를 많이 봐왔다.
선언하지 않으면 자동으로 생성된다.
사용이유
역직렬화 를 할때
serialVersionUID 가 일치하는지 검사를 하기 때문이다.
클래스가 변경 되었을때 버전 정보를 보고 맞추기 때문이다.
static final long serialVersionUID = 2L;
객체 직렬화 구현
Member
public class Member implements Serializable {
private static final long serialVersionUID = 1L;
private String name;
private String userId;
public Member(String name, String userId) {
this.name = name;
this.userId = userId;
}
public String getId() {
return userId;
}
}
Main
package Test;
import java.io.*;
public class Serializable {
public static void main(String[] args) {
String path = "/home/skahn/member.data";
Member member = new Member("skahn","rnrl1215");
// 직렬화
try(FileOutputStream fos = new FileOutputStream(path)) {
try ( ObjectOutputStream out =new ObjectOutputStream(fos)) {
out.writeObject(member);
} catch (IOException e) {
e.printStackTrace();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
// 역직렬화
try(FileInputStream fis = new FileInputStream(path)) {
try ( ObjectInputStream in =new ObjectInputStream(fis)) {
Member member1 = (Member) in.readObject();
System.out.println(member1.getId());
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
결과
rnrl1215
참고
serialVersionUID 적어준 경우
만일 역직렬화 할때 클래스가 변경 되었다면 즉 userId 가 없거나 이름이 변경되면
읽어올수는 있지만 getId 했을 경우 null 값이 뜬다.
728x90
반응형
'Language > Java' 카테고리의 다른 글
[Java] getter 와 setter (0) | 2021.09.05 |
---|---|
[Java] Null 안전하게 다루기 (0) | 2021.08.24 |
[Java] java8 에 추가된 기능 (0) | 2021.08.23 |
[Java] Join() 과 StringJoiner (0) | 2021.08.23 |
[Java] Stream API (0) | 2021.08.23 |
댓글