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:

해당 예외가 발생합니다.

반응형