본문 바로가기

언어/JAVA

Serialize(직렬화)

Serialize(직렬화)란?

말그대로 객체를 직렬화하여 전송 가능한 형태로 만드는 것을 의미한다. 

객체의 상태를 바이트 스트림으로 변환하는데 사용되는 프로세스로, 디스크 / 파일로 유지되거나 네트워크 통신을 통해 실행중인 다른 Java 가상머신으로 전송될  있다.

이것은 주로 객체들을 통째로 파일로 저장하거나 전송하고 싶을 때 주로 사용된다.

직렬화는 생성한 클래스를 Serializable 인터페이스를 구현하는 클래스로 만듬으로써 가능하다.

 

역직렬화(Deserialize)

바이트 스트림을 다시 객체형태로 변환하는 작업을 말한다. 생성된 바이트는 플랫폼에 독립적이며  플랫폼에서 직렬화된 객체는 다른 플랫폼에서 역직렬화를 통해 데이터를 받아올  있다.

 

serialVersionUID

객체의 해시코드로 직렬화될  객체에 표시되는 식별자 역할을 한다.

serialver 같은 툴로 객체의 serialVersionUID 알아낼  있으며 객체의 버전관리에 사용된다.

serialVersionUID 지정하지 않으면 클래스에서 필드를 추가하거나 수정할  serialVersionUID  클래스에 대해 생성되고 이전 직렬화된 객체가 다르기 때문에 이미 직렬화된 객체를 복구할  없다.

Java 직렬화 프로세스는 직렬화된 객체의 상태를 복구하기 위해 올바른 serialVersionUID 사용하고 serialVersionUID 일치하지 않는 경우 java.io.InvalidClassException 발생시킨다

 

 

직렬화 대상

Class SerialEx implements Serializable{
	private String email;
    private int age;

    public SerialEx(String name, String email, int age) {
        this.name = name;
        this.email = email;
        this.age = age;
    }

    @Override
    public String toString() {
        return String.format("SerialEx{name='%s', email='%s', age='%s'}", name, email, age);
    }
}

 

직렬화 예제

class Scratch {
    public static void main(String[] args) {
        String byteString = serialize();
        System.out.println(byteString);
    }

    private static String serialize() {
        SerialEx example = new SerialEx("serial", "serial@tistory.co.kr", 31);
        byte[] serialized;
        String serializedStr = "";
        try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) {
            try (ObjectOutputStream oos = new ObjectOutputStream(baos)) {
                oos.writeObject(example);
                serialized = baos.toByteArray();
                serializedStr = Base64.getEncoder().encodeToString(serialized);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return serializedStr;
    }
}

 

역직렬화(Deserialization) 예제

class Scratch {
    public static void main(String[] args) {
		String serializedStr = "";
        byte[] serialized = Base64.getDecoder().decode(serializedStr);
        deserialize(serialized);
    }

    private static void deserialize(byte[] serialized) {
        try (ByteArrayInputStream bais = new ByteArrayInputStream(serialized)) {
            try (ObjectInputStream ois = new ObjectInputStream(bais)) {
                Object o = ois.readObject();
                SerialEx o1 = (SerialEx) o;
                System.out.println(o1);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

 

 

참고

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

'언어 > JAVA' 카테고리의 다른 글

람다식(Lambda Expression)  (0) 2021.12.17
Stream  (0) 2021.12.16
Java 입출력 (InputStream/OutputStream)  (0) 2021.12.11
Hash  (0) 2021.12.07
22장 자바 컬렉션 part1  (0) 2021.11.05