bdfgdfg
자바의 직렬화 본문
자바에서 입출력을 수행하기위해 두 대상을 연결하고 데이터를 전송할 수 있는 스트림이 필요하다.
-> 이전챕터의 스트림과 다른 것.
-> 여기서 말하는 스트림은 데이터를 운반하는데 사용되는 연결통로.
-> 하나의 버퍼라고 보면 편하다
직렬화는 어떤 데이터 구조나 객체를 바이트 스트림으로 바꾸는 것을 의미.
-> 반대로 스트림으로부터 데이터를 읽어 기존의 데이터 구조나 객체로 만드는 것을 역직렬화라고 한다.
ObjectInputStream, ObjectOutputStream
직렬화(Write)에는 ObjectOutputStream을 사용하고 역직렬화(read)는 ObjectInputStream을 사용한다.
-> 다만 두 스트림은 보조 스트림이므로 실제 데이터를 주고받는 스트림에 지정해주어야 한다.
다만 객체를 직렬화/역직렬화 하는것은 객체의 모든 인스턴스 변수가 참조하고 있는 모든 객체에 대한 것이기에 상당히 복잡하고 시간도 오래걸린다고 한다.
직렬화가 가능한 클래스 만들기 - Serializable, transient
import java.io.Serializable;
class Student implements java.io.Serializable
Serializable인터페이스를 구현하도록 하면 된다. 만약 위 Serializable을 구현한 클래스를 상속받는 자식 클래스가 있다면
따로 Serializable을 구현하지않아도 된다.
class SuperUserInfo implements Serializable
{
private String name;
private String password;
}
class UserInfo extends SuperUserInfo
{
private int age;
}
위의 경우 UserInfo를 직렬화하면 부모인 SuperUserInfo의 name과 password는 함께 직렬화 된다. 다만
class SuperUserInfo
{
private String name;
private String password;
}
class UserInfo extends SuperUserInfo implements Serializable
{
private int age;
}
위와같이 되어버리면 부모객체의 멤버는 직렬화 되지 않는다.
또한 참조타입. 즉 멤버로 인스턴스를 가리키는 멤버변수를 가진다면 해당 멤버변수도 Serializable이 구현되어 있어야한다. 만약 그렇지않다면 따로 transient 키워드를 이용해 직렬화 대상에서 제외할 수 있다.
class SuperUserInfo implements Serializable
{
protected String name;
protected int password;
protected SuperUserInfo(String name, int password)
{
this.name = name;
this.password = password;
}
}
class UserInfo extends SuperUserInfo
{
protected int age;
UserInfo(String name, int password, int age)
{
super(name,password);
age = age;
}
// 실제 직렬화 구현은 마지막 자식에서 깔끔하게
private void writeObject(ObjectOutputStream out) throws IOException
{
out.writeUTF(name);
out.write(password);
out.defaultWriteObject(); // defaultWriteObject는 현재 자신 클래스의 멤버를 자동으로 직렬화
}
// 실제 직렬화 구현은 마지막 자식에서 깔끔하게
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException
{
name = in.readUTF();
password = in.read();
in.defaultReadObject(); // defaultReadObject는 현재 자신 클래스의 멤버를 자동으로 역직렬화
}
}
'웹프로그래밍 > Java' 카테고리의 다른 글
자바 소켓통신 (0) | 2023.10.08 |
---|---|
자바 소켓프로그래밍 (0) | 2023.08.01 |
스트림(Stream) (0) | 2023.07.30 |
람다 (0) | 2023.07.30 |
쓰레드 (0) | 2023.07.29 |