**review**
IO : 입력 출력
4가지 대표적인 부모 클래스
8bit InputStream OutputStream
16bit Reader Writer
Node Stream 계열 / Process Stream 계열
직접 장치에 연결 부가기능을 위해 존재
독립적 사용가능 반드시 다른 스트림을 필요로 한다.(생성자에서 요구)
ex) //콘솔에 연결되는 Node Stream
InputStream is=System.in;
// Process Stream 8bit -> 16bit으로 변환하는 기능을 가진 InputStreamReader
InputStreamReader isr=new InputStreamReader(is);
//Process Stream : resdLine()을 가진 BufferedReader
BufferedReader br=new BufferedReader(isr);
String str=br.readLine();
while(str=null){
sysout(str);
str=br.readLine();
{
br.close();
**오늘 할 내용**
**객체 직렬화(Object serialization)**
메모리에서 오브젝트로(string), 반대로 오브젝트에서 메모리로는 역직렬화 -me
객체 직렬화란 바이트 단위의 스트림으로 객체의 데이터를 외부에 전송하는 기술
객체 역직렬화란 외부에 저장된 데이터를 다시 객체로 복원하는 것
java.io.Serializable Interface
: Serializable interface 를 implements 한 클래스는 객체 직렬화
만약 위 interface를 implements 하지 않고 직렬화를 시도하면
Exception 발생한다.
ex) class Person Implements Serializable{
}
*transient 지정자(modifier) : 객체 직렬화 대상에서 제외
private String password="javaking";
위와 같이 명시하면 직렬화 시 null
ObjectInputStream readObject() : Object(리턴타입이 오브젝트(어떤타입일지모르기때문))
ObjectOutputStream writeObject(o:Object)
step1 - Person (Person 객체를 직렬화하여 Person.obj 파일에 저장하는 예제)
package step1;
import java.io.Serializable;
// 객체 직렬화를 위해 반드시 Serializable을 implements 해야 한다.
public class Person implements Serializable{
/**
*
*/
private static final long serialVersionUID = 8641931547374219328L;
private String name;
private transient String password;
//transient : 객체 직렬화 대상에 제외(패스워드니깐)
private int age;
private String address;
//생성자(3), set/get
public Person(String name, String password, int age) {
super();
this.name = name;
this.password = password;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
step1 -
TestObjectOutput
package step1;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
public class TestObjectOutput {
/**
* Person 객체를 직렬화하여
* Person.obj 파일에 저장하는 예제
*
* 만약 Person class가 java.io.Serializable interface를 implements 하지 않으면
* java.io.NotSerialiazableException: step1.Person과 같은 Exception이 발생한다.
*/
public static void main(String[] args){
try{
FileOutputStream fos= new FileOutputStream("C:\\java-kosta\\person.obj");
ObjectOutputStream oos=new ObjectOutputStream(fos);
Person p=new Person("아이유","java",22);
oos.writeObject(p);
oos.close();
System.out.println("Person.obj에 객체저장");
}catch(FileNotFoundException e){
e.printStackTrace();
}
catch(IOException e){
e.printStackTrace();
}
}
}
결과 :
Person.obj에 객체저장
step2 - TestObjectInput
package step2;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import step1.Person;
public class TestObjectInput {
/**
* 객체 역직렬화 예제
* person.obj에 저장되어 있는 정보를 역직렬화하여
* 객체로 복원하여 확인하는 예제
*
* FileInputStream : node
* ObjectInputStream : process
* readObject() : Object
* Person 의 이름과 나이만 출력해보세요
*/
public static void main(String[] args) {
try {
FileInputStream fis=new FileInputStream("C:\\java-kosta\\person.obj");
ObjectInputStream ois=new ObjectInputStream(fis);
Person p=(Person)ois.readObject();
System.out.println(p.getName()+" "+p.getAge()+" "+p.getPassword());
ois.close();
} catch (FileNotFoundException fe) {
fe.printStackTrace();
}catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException ce) {
ce.printStackTrace();
}
}
}
결과 :
아이유 22 null
step3 - Car
package step3;
import java.io.Serializable;
public class Car implements Serializable{
private String model;
private int price;
private String color;
//constructor, set/get
public Car(String model, int price, String color) {
super();
this.model = model;
this.price = price;
this.color = color;
}
public String getModel() {
return model;
}
public void setModel(String model) {
this.model = model;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
}
step3 - SerialService
package step3;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
public class SerialService {
/**
* 객체를 지정한 path에 직렬화하여 저장
* @param path
* @param list
*/
public void output(String path, ArrayList list) throws IOException{
File f=new File(path);
f.getParentFile().mkdirs();
ObjectOutputStream oos=null;
FileOutputStream fos=null;
try{
fos=new FileOutputStream(f);
oos=new ObjectOutputStream(fos);
oos.writeObject(list);
}finally{
if(oos!=null)
oos.close();
if(fos!=null)
fos.close();
}
}
/**
* path의 파일에 저장된 정보를
* 역직렬화하여 객체로 복원하여
* ArrayList를 반환하는 메쏘드
* @param path
*/
public ArrayList input(String path) throws IOException, ClassNotFoundException{
ArrayList list=null;
ObjectInputStream ois=null;
FileInputStream fis=null;
try{
fis=new FileInputStream(path);
ois=new ObjectInputStream(fis);
list=(ArrayList)ois.readObject();
}finally{
if(ois!=null)
ois.close();
if(fis!=null)
fis.close();
}
return list;
}
}
<
step3 - TestSerialService (객체를 지정한 path에 직렬화하여 저장)
package step3;
import java.util.ArrayList;
public class TestSerialService {
/**
* @param args
*/
public static void main(String[] args) {
SerialService service=new SerialService();
ArrayList list=new ArrayList();
list.add(new Car("k5", 100, "검정"));
list.add(new Car("k7", 200, "빨강"));
list.add(new Car("k9", 300, "노랑"));
try{
service.output("C:\\java-kosta\\serial\\list.obj", list);
System.out.println("list를 list.obj에 저장");
}catch(Exception e){
e.printStackTrace();
}
}
}
결과 : list를 list.obj에 저장