-
ObjectStreamjava 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