Free Lines Arrow
본문 바로가기
Language/Java

[Java] 직렬화, 역직렬화

by skahn1215 2021. 8. 23.
728x90
반응형

Serialization

  • 직렬화란 객체를 데이터 스트림으로 만드는 것을 말한다.
  • 역직렬화란 스트림으로부터 데이터를 읽어서 객체를 만드는 것을 말한다.
  • 객체를 바이트로 만들어 저장 하고 바이트로된 데이터를 읽어서 객체로 만든다.

 

 

왜 필요할까?

  • 객체를 따로 저장했다가 읽을때 사용한다.
  • 네트웍을 통해 컴퓨터 간에 서로 객체를 주고 받을때 사용한다.

 

 

 

serialVersionUID

serialVersionUID 를 쓰는경우를 많이 봐왔다.

선언하지 않으면 자동으로 생성된다.

 

 

 

사용이유

역직렬화 를 할때 

serialVersionUID 가 일치하는지 검사를 하기 때문이다.

클래스가 변경 되었을때 버전 정보를 보고 맞추기 때문이다.

static final long serialVersionUID = 2L;

 

 

 

객체 직렬화 구현

Member

public class Member implements Serializable {
    private static final long serialVersionUID = 1L;

    private String name;
    private String userId;

    public Member(String name, String userId) {
        this.name = name;
        this.userId = userId;
    }

    public String getId() {
        return userId;
    }
}

 

Main

package Test;

import java.io.*;

public class Serializable {
    public static void main(String[] args) {
        String path = "/home/skahn/member.data";
        Member member  = new Member("skahn","rnrl1215");

        // 직렬화
        try(FileOutputStream fos = new  FileOutputStream(path)) {
            try ( ObjectOutputStream out =new ObjectOutputStream(fos)) {
                out.writeObject(member);
            } catch (IOException e) {
                e.printStackTrace();
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }


        // 역직렬화
        try(FileInputStream fis = new  FileInputStream(path)) {
            try ( ObjectInputStream in =new ObjectInputStream(fis)) {
                Member member1 = (Member) in.readObject();
                System.out.println(member1.getId());
           } catch (IOException e) {
                e.printStackTrace();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

 

결과

rnrl1215

 

 

참고

serialVersionUID 적어준 경우

만일 역직렬화 할때 클래스가 변경 되었다면 즉 userId 가 없거나 이름이 변경되면

읽어올수는 있지만 getId 했을 경우 null 값이 뜬다.

728x90
반응형

'Language > Java' 카테고리의 다른 글

[Java] getter 와 setter  (0) 2021.09.05
[Java] Null 안전하게 다루기  (0) 2021.08.24
[Java] java8 에 추가된 기능  (0) 2021.08.23
[Java] Join() 과 StringJoiner  (0) 2021.08.23
[Java] Stream API  (0) 2021.08.23

댓글