Serializable 인터페이스 

직렬화는 인스터스의 내용이 외부(파일,네트웍)로 유출되는 것이므로 프로그래머가 객체의 직렬화 가능 여부를 명시함

구현 코드가 없는 mark interface 

 

직렬화의 사용이유?

자바 시스템 내부에서 사용되는 Object 또는 Data를 외부의 자바 시스템에서도 사용할 수 있도록 byte 형태로 데이터를 변환하는 기술.

JVM(Java Virtual Machine 이하 JVM)의 메모리에 상주(힙 또는 스택)되어 있는 객체 데이터를 바이트 형태로 변환하는 기술

특별히 어려운 내용없이 byte 데이터로 입출력해주는 인터페이스 역할을 해주는 Serializable 인터페이스 (직렬화)입니다.

 

코드로 하나씩 확인해보겠습니다.

package Test01;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.net.Socket;

class Person implements Serializable{
	String name;
	String job;//transient String job 직렬화를 하지마라 
	
	
	public Person(String name, String job) {
	this.name=name;
	this.job=job;
	}
	
	public String toString() {
		return name+","+job;
	}
	
}



public class Main {

	
	
	public static void main(String [] args)   {
		
		
		
		Person personLee=new Person("이순신","엔지니어");
		Person personKim=new Person("김유신","선생님");
		
		try(FileOutputStream fos=new FileOutputStream("serial.dat");
				ObjectOutputStream oos=new ObjectOutputStream(fos);
				){
			oos.writeObject(personLee);
			oos.writeObject(personKim);
		}
		
		catch (Exception e) {
					// TODO: handle exception
			System.out.println(e);
				}
		
		
		try(FileInputStream fis=new FileInputStream("serial.dat");
				ObjectInputStream ois=new ObjectInputStream(fis);
				){
			Person p1=(Person)ois.readObject();
			Person p2=(Person)ois.readObject();
			System.out.println(p1);
			System.out.println(p2);
			
		}catch (IOException e) {
			// TODO: handle exception
			System.out.println(e);
		}catch (ClassNotFoundException e) {
			// TODO: handle exception
			System.out.println(e);
		}
		
		
		
      
	}
	
	
	
}

Person 클래스:

transient는 직렬화 변수를 직렬화하지 못하도록 하는 기능을 추가할수 있습니다.

일단 여기서는 직렬화를 사용할거라 Serializable 인터페이스를 상속받습니다.

class Person implements Serializable{
	String name;
	String job;//transient String job 직렬화를 하지마라 
	
	
	public Person(String name, String job) {
	this.name=name;
	this.job=job;
	}
	
	public String toString() {
		return name+","+job;
	}
	
}

그렇다면 main에서 이 Person 클래스를 객체화 하여 사용해보겠습니다. 

 

아래와 같이 serial.dat로 writeObject 메서드를 통해서 객체자체를 write 해줍니다. 

Person personLee=new Person("이순신","엔지니어");
Person personKim=new Person("김유신","선생님");
		
		try(FileOutputStream fos=new FileOutputStream("serial.dat");
				ObjectOutputStream oos=new ObjectOutputStream(fos);
				){
			oos.writeObject(personLee);
			oos.writeObject(personKim);
		}
		
		catch (Exception e) {
					// TODO: handle exception
			System.out.println(e);
				}
		
		

그렇다면  serial.dat가 생성되고 output을 출력해줄 inputStream을 적용합니다.

아래 코드를 보면 

try(FileInputStream fis=new FileInputStream("serial.dat");
				ObjectInputStream ois=new ObjectInputStream(fis);
				){
			Person p1=(Person)ois.readObject();
			Person p2=(Person)ois.readObject();
			System.out.println(p1);
			System.out.println(p2);
			
		}catch (IOException e) {
			// TODO: handle exception
			System.out.println(e);
		}catch (ClassNotFoundException e) {
			// TODO: handle exception
			System.out.println(e);
		}
		

try 블록 안에 Object 형식으로 읽은 후에  toString 을 통해서 출력해줍니다.

Person p1=(Person)ois.readObject();
Person p2=(Person)ois.readObject();
System.out.println(p1);
System.out.println(p2);

입출력 자체는 개념이 쉬워서 크게 어려운면은 없습니다. 

이런 저런 기능이 존재하는구나라고 기억만 해두시고 필요할때는 자바 다큐먼트를 이용하거나 stackoverflow에서 찾는걸 추천합니다.

'프로그래밍언어 > JAVA' 카테고리의 다른 글

<JAVA>데코레이터 패턴  (0) 2020.12.13
<JAVA>몇가지 추가 입출력 클래스  (0) 2020.12.13
<JAVA>보조 스트림  (0) 2020.12.12
<JAVA>문자 단위 스트림  (0) 2020.12.12
<JAVA>바이트 단위 문자 입출력  (0) 2020.12.12

+ Recent posts