bdfgdfg

자바의 직렬화 본문

웹프로그래밍/Java

자바의 직렬화

marmelo12 2023. 8. 1. 13:49
반응형

자바에서 입출력을 수행하기위해 두 대상을 연결하고 데이터를 전송할 수 있는 스트림이 필요하다.

 -> 이전챕터의 스트림과 다른 것.

 -> 여기서 말하는 스트림은 데이터를 운반하는데 사용되는 연결통로.

 -> 하나의 버퍼라고 보면 편하다

 

직렬화는 어떤 데이터 구조나 객체를 바이트 스트림으로 바꾸는 것을 의미.

 -> 반대로 스트림으로부터 데이터를 읽어 기존의 데이터 구조나 객체로 만드는 것을 역직렬화라고 한다.

 

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
Comments