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

+ Recent posts