1 답변
-
직렬화란?
객체의 직렬화는 객체의 내용을 바이트 단위로 변환하여 파일 또는 네트워크를 통해서 스트림(송수신)이 가능하게 하는것을 의미한다. 자바 I/O 처리는 정수, 문자열, 바이트 단위의 처리만 지원했었다.따라서 복잡한 객체의 내용을 저장/복원하거나, 네트워크로 전송하기 위해서는 객체의 멤버변수의 각 내용을 일정한 형식으로 만들어(이것을 패킷이라고 한다) 전송해야 했다.
객체직렬화는 객체의 내용(구체적으로는 멤버변수의 내용)을 자바 I/O가 자동적으로 바이트 단위로 변환하여, 저장/복원하거나 네트워크로 전송할 수 있도록 기능을 제공해준다.
즉, 개발자 입장에서는 객체가 아무리 복잡하더라도, 객체직렬화를 이용하면 객체의 내용을 자바 I/O가 자동으로 바이트 단위로 변환하여 저장이나 전송을 해주게 된다.
직렬화 수행을 위한 파일 저장과 읽기
▼ 우선 파일저장을 위해서는 FileOutputStream 클래스가 필요합니다. 파일이 저장될 위치를 인수로 받아서 객체를 생성한뒤 직렬화를 위해 ObjectOutputStream 클래스를 사용하였습니다. 직렬화를 만드는 함수는 writeObject() 입니다. Serializable 인터페이스를 상속받은 User 객체를 인수로 넘깁니다.
// 마샬링(marshalling) 수행, 직렬화 public void doSerializable() throws IOException { FileOutputStream fos = new FileOutputStream(filePath); ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeObject(user); oos.close(); }
직렬화한 파일을 다시 읽어 들이기 위해 FileInputStream 과 ObjectInputStream 클래스를 사용하였습니다. 읽어들이는 함수는 readObject() 이며 해당 객체로 채스팅을 해 줘야 겠죠.
// 언마샬링(unmarshalling) 수행, 역직렬화 public Object undoSerializable() throws IOException, ClassNotFoundException { FileInputStream fis = new FileInputStream(filePath); ObjectInputStream ois = new ObjectInputStream(fis); Object user = ois.readObject(); ois.close(); return user; }
직렬화 전체 소스
▼ init() 함수에서 직렬화 객체에 데이터를 셋팅한후 doSerializable() 함수를 이용해서 직렬화하고 파일로 저장합니다. 그리고 다시 undoSerializable() 함수를 이용해서 직렬화를 해제한뒤 콘솔에 그 값을 찍는 내용입니다.
import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; public class Main { private String filePath; private User user; public static void main(String[] args){ Main main = new Main(); try { main.init(); main.doSerializable(); User user = (User) main.undoSerializable(); System.out.println(user.getName()); System.out.println(user.getAge()); System.out.println(user.getPhoneNumber()); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } public void init() { filePath = "C:\\user.ser"; user = new User(); user.setName("kim dong"); user.setAge(50); user.setPhoneNumber("010-9858-9985"); } // 마샬링(marshalling) 수행, 직렬화 public void doSerializable() throws IOException { FileOutputStream fos = new FileOutputStream(filePath); ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeObject(user); oos.close(); } // 언마샬링(unmarshalling) 수행, 역직렬화 public Object undoSerializable() throws IOException, ClassNotFoundException { FileInputStream fis = new FileInputStream(filePath); ObjectInputStream ois = new ObjectInputStream(fis); Object user = (User) ois.readObject(); ois.close(); return user; } } // 직렬화 객체 class User implements Serializable { private static final long serialVersionUID = 2L; private String name; private int age; private String phoneNumber; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getPhoneNumber() { return phoneNumber; } public void setPhoneNumber(String socialNumber) { this.phoneNumber = socialNumber; } }
// 결과 kim dong 50 010-9858-9985
댓글 입력