ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Camel][Java] ObjectInputStream & ObjectOutputStream
    Java/개념 정리 2020. 3. 5. 14:44

    ObjectInputStream & ObjectOutputStream 

     ObjectInputStream과 ObjectOutputStream은 인스턴스의 입출력에 사용되는 클래스입니다. 이 클래스들은 사실상 Byte 스트림에 속하지만 오브젝트 스트림으로 구분하여 설명하는 경우가 많습니다. 사용방법은 필터스트림과 매우 흡사하지만 필터스트림으로 구분하지는 않습니다. 그 이유는 필터 스트림이 상속하는 클래스를 상속하지 않기 때문입니다. 

     

     인스턴스의 저장과 복원에는 ObjectOutputStream과 ObjectInputStream에 정의되어 있는 아래의 메소드가 사용됩니다. 

    // writeObject 메소드는 ObjectOutputStream 에 정의 되어있다.
    public final void writeObject(Object obj) throws IOException
    // readObject 메소드는 ObjectInputStream 에 정의 되어있다.
    public final Object readObject() throws IOException, ClassNotFoundException

     인스턴스가 파일에 저장되는 과정을 직렬화(Serializable)이라고 하고, 파일로부터 복원되는 과정을 역직렬화(Deserializable)라고 합니다. 입출력의 대상이 되는 인스턴스의 클래스는 Serializable 인터페이스를 구현하거나, Serializable 인터페이스를 구현하는 클래스를 상속해야합니다.  

     

    Serializable 인터페이를 사용한다는 것은 인스턴스의 직렬화를 허용하는 것을 의미합니다. 이것은 파일에 국한되지 않고 다양한 입출력 대상을 통해서 인스턴스의 이동이 이뤄지는 상황에서는 Serializable과 Deserializable이 발생합니다.

     

    Serializable이 적용된 예시 코드

    import java.io.*;
    
    class Rectangle implements Serializable {
    	int x;
        	int y;
        
        	public Rectangle(int xLen, int yLen) {
        		x = xlen;
            	y = yLen;
        	}
        
        	public showInfo() {
        		System.out.println("%d, %d");
        	}
    }
    
    class SerializeObject {
    	public static void main ( String[] args ) throws IOException, ClassNotFoundException {
        	
            	// 인스턴스 저장과정
            	ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("camel.ser"));
            
            	out.writeObject(new Rectangle(3,4));
            	out.writeObject(new Rectangle(10,20));
            	out.writeObject(new String("Camel Rectangle"));
            	out.close();
            
            	//인스턴스 복원과정
            	ObjectInputStream in = new ObjectInputStream(new FileInputStream("camel.ser"));
            
            	Rectangle rec1 = (Rectangle)in.readObject();
            	Rectangle rec2 = (Rectangle)in.readObject();
           
            	String str = in.readObject();
            
            	in.close();
            	
                	//출력과정
            	rec1.showInfo(); 
            	rec1.showInfo();  
            	System.out.println(str);
            	// 출력결과
            	// 3, 4
            	// 10, 20
            	// Camel Rectangle
        }
    }

     위 코드에서 Rectangle 클래스는 Serializable 인터페이스를 구현하기 때문에 Rectangle 인스턴스는 직렬화의 대상이 됩니다. 인스턴스 저장과정에서 인스턴스를 생성과 동시에 저장하는 것을 확인할 수 있고, 이후 복원과정에서 인스턴스는 위 예시의 출력과정에서 처럼 저장된 순서대로 복원되어져야 합니다. 

     

    직렬화에서 제외시키기 위해 사용하는 transient

     만약 Serializable 인터페이스를 구현하는 클래스 내에서 직렬화의 대상에서 제외하고 싶다면 어떻게 해야할까? 그 방법은 인스턴스 변수 앞에 transient를 붙여주면 됩니다. 

    댓글

Camel`s Tistory.