ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • ObjectStream
    java 2020. 5. 10. 01:47

    ●Object Stream

    -메모리상에 존재하는 객체를 송수신 할 수 있는 필터 스트림이다.

    -필터 스트림이므로 기본 스트림이 필요하다.

     

    ●객체 직렬화

    -메모리 상에 존재하는 객체를 출력할 수 있는 형태로 만드는 것을 가르켜 직렬화라고 부른다.

    -직렬화 하지 않은 객체를 스트림을 통해 입출력 할 수 없다.

    -자바에서는 직렬화 하기 위해 Serializable이라는 인터페이스를 구현하면 된다.

     

    클래스로부터 객체를 생성하게 되면 객체는 메모리상에 존재하게 된다. 메모리상에 존재하는 객체를 송수신 할 수 있게 하는 필터스트림이 오브젝트 스트림이다.

    메모리상에 존재하는 객체를 파일에다가 써놓았다가 파일에다가 써놓은 데이터를 기초로 객체로 복원 할 수 있는게 오브젝트 스트림이다.

     

    파일에다가 스트림을 통해서 송신할 객체, 혹은 데이터를 통해서(즉 외부에 있는 데이터를 받아서 생성할 객체), 이 객체는 직렬화라는 것을 해줘야지만 이러한 작업이 이루어 진다.

     

    오브젝트 인,아웃풋 스트림을 사용하면 메모리상에 존재하는 객체를 파일에 쓸 수 있고,

    파일에 존재하는 객체정보를 읽어와서 객체를 생성할 수 있다.

    *객체를 파일에 읽고 쓸 때 객체의 원본이 되는 클래스는 반드시 Serializable이라는 인터페이스를 구현한 클래스여야 한다.

     

    정리

    -ObjectStream은 메모리상의 객체를 송수신 할 수 있는 필터 스트림이다.

    -객체를 송수신하기 위해서는 반드시 객체 직렬화를 해줘야 한다.

     

    객체 직렬화를 하지않고 입출력(오류가 발생한다.)

    import java.io.FileOutputStream;
    import java.io.ObjectOutputStream;
    
    public class ObjectStream1 {
    
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		try {
    			TestClass t = new TestClass();
    			t.a = 100;
    			t.b = 200;
    			
    			FileOutputStream fos = new FileOutputStream("D:\\Test!!!!!\\d.txt");
    			ObjectOutputStream oos = new ObjectOutputStream(fos);
    			oos.writeObject(t);
    			oos.flush();
    			oos.close();
    			fos.close();
    			//java.io.NotSerializableException에러가 발생하게 된다.
    			//객체 직렬화를 하지 않으면 오류가 발생한 상태로 파일이 써지게 된다.
    			
    			
    		}catch(Exception e) {
    			e.printStackTrace();
    		}
    	}
    
    }
    
    class TestClass{
    	int a;
    	int b;
    	
    	public void sayHi() {
    		System.out.println("안녕하세요");
    	}
    }
    

     

    객체 직렬화를 하고 아웃풋

    import java.io.FileOutputStream;
    import java.io.ObjectOutputStream;
    import java.io.Serializable;
    
    public class ObjectStream2 {
    
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		try {
    			TestClass t = new TestClass();
    			t.a = 100;
    			t.b = 200;
    			
    			FileOutputStream fos = new FileOutputStream("D:\\\\Test!!!!!\\\\e.txt");
    			ObjectOutputStream oos = new ObjectOutputStream(fos);
    			oos.writeObject(t);
    			oos.flush();
    			oos.close();
    			fos.close();
    		}catch(Exception e) {
    			e.printStackTrace();
    		}
    	}
    
    }
    
    class TestClass implements Serializable{
    	int a;
    	int b;
    	public void sayHi() {
    		System.out.println("안녕하세요");
    	}
    }
    

     

    객체 직렬화를 한 인풋

    import java.io.FileInputStream;
    import java.io.ObjectInputStream;
    import java.io.Serializable;
    
    public class ObjectStream3 {
    
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		try {
    			FileInputStream fis = new FileInputStream("D:\\\\\\\\Test!!!!!\\\\\\\\e.txt");
    			ObjectInputStream ois = new ObjectInputStream(fis);
    			
    			TestClass t2 = (TestClass)ois.readObject();
    			
    			System.out.println(t2.a);
    			System.out.println(t2.b);
    			t2.sayHi();
    		}catch(Exception e) {
    			
    		}
    	}
    
    }
    
    class TestClass implements Serializable{
    	
    	int a;
    	int b;
    	
    	public void sayHi() {
    		System.out.println("안녕하세요");
    	}
    }
    

     

     

    아웃풋에서 객체 직렬화를 해주고 아웃풋 했기 때문에 인풋에서는 객체 직렬화를 하지 않아도 인풋이 될꺼라고 생각했지만 인풋에서도 객체 직렬화를 해주어야 인풋이 된다.

     

    참조 : 인프런 - 안드로이드를 위한 자바 - ObjectStream

     

    'java' 카테고리의 다른 글

    네트워크  (0) 2020.05.10
    2byteStream  (0) 2020.05.09
    데이터 스트림  (0) 2020.05.09
    FileStream  (0) 2020.05.09
    폴더가 존재하는지 존재하지 않는지 보고 존재하지 않으면 생성  (0) 2020.05.09

    댓글

Designed by Tistory.