Serializable
내부에서 사용되는 객체나 데이터를 외부에서도 사용할 수 있도록 byte형태로 변환
Exam)컴퓨터1이라는 개발환경에서 읽어 들일 수 있는 데이터(객체)를
컴퓨터2에서 읽어 들일 때 개발환경이 같다면 읽어들일 수 있음
Deserialize
byte로 변환된 객체나 데이터를 원래의 객체나 데이터로 변환
컴퓨터1(직렬화) >>> 컴퓨터2(역직렬화)
SerialVersionUID(개발환경ID) : 개발환경이 같은지 다른지 구분하기 위해 있는 ID
역직렬화를 할때 값이 같은지 체크 함, 다르다면 개발환경이 다르다며 에러가 발생함
작성하지 않을 경우 직렬화 시 내부에서 자동 생성됨
직렬화를 할 객체에 작성한다
직렬화를 할 Bean
package Study;
import java.io.Serializable;
public class MemberBean implements Serializable{
private static final long serialVersionUID = 2545104744891989076L;//개발환경을 구분하기위한 ID, 미작성시 자동생성 됨
private int memberNum;
private String memberId;
private String memberPass;
private String memberPhone;
private String memberAddress;
private transient String memberName; //transient : 직렬화(Serializable) 제외
//생성자
public MemberBean(int memberNum, String memberId, String memberPass, String memberPhone, String memberAddress,
String memberName) {
super();
this.memberNum = memberNum;
this.memberId = memberId;
this.memberPass = memberPass;
this.memberPhone = memberPhone;
this.memberAddress = memberAddress;
this.memberName = memberName;
}
//getter, setter
public int getMemberNum() {
return memberNum;
}
public void setMemberNum(int memberNum) {
this.memberNum = memberNum;
}
public String getMemberId() {
return memberId;
}
public void setMemberId(String memberId) {
this.memberId = memberId;
}
public String getMemberPass() {
return memberPass;
}
public void setMemberPass(String memberPass) {
this.memberPass = memberPass;
}
public String getMemberPhone() {
return memberPhone;
}
public void setMemberPhone(String memberPhone) {
this.memberPhone = memberPhone;
}
public String getMemberAddress() {
return memberAddress;
}
public void setMemberAddress(String memberAddress) {
this.memberAddress = memberAddress;
}
public String getMemberName() {
return memberName;
}
public void setMemberName(String memberName) {
this.memberName = memberName;
}
//toString
@Override
public String toString() {
return "MemberBean [memberNum=" + memberNum + ", memberId=" + memberId + ", memberPass=" + memberPass
+ ", memberPhone=" + memberPhone + ", memberAddress=" + memberAddress + "]";
}
}
메인 클래스
package Study;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.List;
public class SerializableStudy {
public static void main(String[] args) {
SerializableStudy study = new SerializableStudy();//클래스 객체 생성
study.serializableStudy();//직렬화 실행
study.deserializeStudy();//역직렬화 실행
}
public void serializableStudy() {
MemberBean memberBean1 = new MemberBean(1, "ABC123", "1234", "010-1111-1111", "tokyo", "tanaka");//Bean객체 생성
MemberBean memberBean2 = new MemberBean(1, "DEF456", "5678", "010-2222-2222", "osaka", "kimura");//Bean객체 생성
List<MemberBean> memberList = new ArrayList<MemberBean>();//Bean객체를 받는 리스트 생성
memberList.add(memberBean1);//리스트 추가
memberList.add(memberBean2);
try{
FileOutputStream fos = new FileOutputStream("c:\\test\\result.txt");//출력위치
ObjectOutputStream oos = new ObjectOutputStream(fos);//객체를 출력하는 스트림
/*객체 쓰기*/
oos.writeObject(memberBean1);//FileOutputStream : java.io.FileOutputStream@15db9742
oos.writeObject(memberList);//ObjectOutputStream : java.io.ObjectOutputStream@6d06d69c
oos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public void deserializeStudy() {
try {
FileInputStream fis = new FileInputStream("c:\\test\\result.txt");//입력위치
ObjectInputStream ois = new ObjectInputStream(fis);//객체를 입력하는 스트림
Object memberBean = ois.readObject();//첫번째 객체를 읽어 들임
Object memberList = ois.readObject();//두번째 객체를 읽어 들임
System.out.println(memberBean.toString());//읽어들인 객체 출력
System.out.println(memberList.toString());
ois.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
직렬화를 할 객체는 implements Serializable을 구현함
직렬화를 제외할 멤버변수는 멤버타입 앞에 transient을 작성
역직렬화 시 직렬화를 했을때의 객체구조가 바뀌면 에러가 발생할 수 있음
멤버변수가 추가 되었을 때 : 추가된 필드에 null값이 입력됨(가능)
멤버변수가 삭제 되었을 때 : 해당 필드에 값을 표시하지 않음(가능)
멤버변수 타입이 변경되었을 때 : 에러발생(불가능)
직렬화를 한 환경의 serialVersionUID(개발환경ID)와 역직렬화를 한 환경 serialVersionUID(개발환경ID)가 다를경우
UID가 다르다고 에러가 발생함
더 좋은 글이 있어서 링크
woowabros.github.io/experience/2017/10/17/java-serialize2.html
'Programming > JAVA' 카테고리의 다른 글
[JAVA] 프로그래밍 네이밍 규칙 (0) | 2020.09.17 |
---|---|
[Spring] JSON (0) | 2020.09.16 |
[JAVA] IndexOf (0) | 2020.09.14 |
[JAVA] 문자열 자르기 (0) | 2020.09.14 |
[JAVA] List (0) | 2020.09.13 |