자바에서 객체 직렬화 (Serialization)는 메모리에 있는 객체 인스턴스를 바이트 스트림으로 변환하여 파일에 저장하거나 네트워크를 통해 전송할 수 있는 기능이다

반대로 역직렬화 (Deserialization) 은 바이트 스트림을 다시 객체화 시키는 작업을 의미한다.

 

근데 요새는 XML, JSON , 데이터 베이스 쓰니까 잘 안쓰긴함ㅋㅋ

그래도 XML, JSON , 데이터 베이스 같은 저장 방식의 조상님격이라 한번 알아봤다!

import java.io.*;
import java.util.ArrayList;
import java.util.List;

/**
 * Object 스트림은 컬렉션을 통으로 쓰고 통으로 읽는다
 * writeObject() , readObject()
 */

public class ObjectMemberRepository implements MemberRepository {

    private static final String FILE_PATH = "temp/members-obj.dat";

    @Override
    public void add(Member member) {
        List<Member> members = findALl();
        members.add(member);

        try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(FILE_PATH))) {
            oos.writeObject(members); // 멤버 객체 개별로 저장할 수 없다. 무조건 하나의 파일 통으로 저장해야 한다
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    @Override
    public List<Member> findALl() {
        try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(FILE_PATH))) {
            Object findObject = ois.readObject();
            return (List<Member>) findObject;
        } catch (FileNotFoundException e) {
            return new ArrayList<>(); // 최초에는 데이터가 없기 때문에 빈 배열을 반환해주면 앞으로 새로 데이터를 쓰는데 유용하게 사용
        } catch (IOException | ClassNotFoundException e) {
            throw new RuntimeException(e);
        }
    }
}

 

바이트 정보와 클래스 정보등과 함께 통으로 저장된 모습