본문 바로가기
언어/JAVA

DataStream, 직렬화

by step 1 2021. 5. 23.
반응형

DataInputStream과 DataOutputStream

자료가 메모리에 저장된 상태 그대로 읽거나 쓰는 스트림

DataInputStream 메서드

메서드 설명
byte readByte() 1바이트를 읽어 반환합니다
boolean readBoolean() 읽은 자료가 0이 아니면 true, 0이면 false를 반환
char readChar() 한 문자를 읽어 반환
short readShort() 2바이트를 읽어 정수 값을 반환
int readInt() 4바이트를 읽어 정수 값을 반환
long readLong() 8바이트를 읽어 정수 값을 반환
float readFloat() 4바이트를 읽어 실수 값을 반환
double readDouble() 8바이트를 읽어 실수 값을 반환
String readUTF() 수정된 UTF-8 인코딩 기반으로 문자열을 읽어 반환

DataStreamTest.java

package ch63;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;

public class DataStreamTest {

	public static void main(String[] args) {
		
		try (FileOutputStream fos = new FileOutputStream("data.txt");
				DataOutputStream dos = new DataOutputStream(fos)){
			
			dos.writeByte(100);
			dos.writeChar('A');
			dos.writeInt(10);
			dos.writeFloat(3.14f);
			dos.writeUTF("TEST");
			
		} catch (Exception e) {
			// TODO: handle exception
			System.out.println(e.getMessage());
		}
		
		try (FileInputStream fis = new FileInputStream("data.txt");
				DataInputStream dis = new DataInputStream(fis)){
			
			System.out.println(dis.readByte());
			System.out.println(dis.readChar());
			System.out.println(dis.readInt());
			System.out.println(dis.readFloat());
			System.out.println(dis.readUTF());
		} catch (Exception e) {
			// TODO: handle exception
		}
		
		System.out.println("실행완료");
	}
}

 

직렬화(serialization)

  • 인스턴스의 상태를 그대로 파일 저장하거나 네트워크로 전송(serialization)하고 이를 다시 복원(deserialization)하는 방식
  • 자바에서는 보조 스트림을 활용하여 직렬화를 제공함

ObjectInputStream과 ObjectOutputStream

생성자 설명
ObjectInputStream(InputStream in) InputStream을 생성자의 매개변수로 받아 ObjectInputStream을 생성
ObjectOutputStream(OutputStream out) OutputStream을 생성자의 매개변수로 받아 ObjectOutputStream을 생성

 

Serializable 인터페이스

  • 직렬화는 인스턴스의 내용이 외부로 유출되는 것이므로 프로그래머가 해당 객체에 대한 직렬화 의도를 표시해야 함
  • 구현 코드가 없는 marker interface
  • transient: 직렬화 하지 않으려는 멤버 변수에 사용함 (Socket등 직렬화 할 수 없는 객체)

SerializationTest.java

package ch64;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

// 직렬화 명시를 해주어야 한다.
class Person implements Serializable{
	
	String name;
	String job;
	
    public Person() {
    	
    }

	public Person(String name, String job) {
		super();
		this.name = name;
		this.job = job;
	}

	@Override
	public String toString() {
		return "Person [name=" + name + ", job=" + job + "]";
	}
    
    
}
public class SerializationTest {

	public static void main(String[] args) {
		
		Person personLee = new Person("이순신", "대표이사");
		Person personKim = new Person("김유신", "상무이사");
		
//		직렬화
		try (FileOutputStream fos = new FileOutputStream("serial.txt");
				ObjectOutputStream oos = new ObjectOutputStream(fos)){
			
			oos.writeObject(personLee);
			oos.writeObject(personKim);
		} catch (Exception e) {
			// TODO: handle exception
			System.out.println(e.getMessage());
		}
		
//		복원
		try (FileInputStream fis = new FileInputStream("serial.txt");
				ObjectInputStream ois = new ObjectInputStream(fis)){
			
			Person pLee =  (Person) ois.readObject();
			Person pKim =  (Person) ois.readObject();
			
			System.out.println(pLee);
			System.out.println(pKim);
		} catch (Exception e) {
			// TODO: handle exception
			System.out.println(e.getMessage());
		}
	}
}

 

Externalizable 인터페이스

  • writerExternal()과 readExternal() 메서드를 구현해야 한다.
  • 프로그래머가 직접 객체를 읽고 쓰는 코드를 구현 할 수 있음

SerializationTest2.java

package ch64;

import java.io.Externalizable;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectInputStream;
import java.io.ObjectOutput;
import java.io.ObjectOutputStream;
import java.io.Serializable;

// 직렬화 명시를 해주어야 한다.
class Person2 implements Externalizable{
	
	String name;
	String job;
	
    public Person2() {
    	
    }

	public Person2(String name, String job) {
		super();
		this.name = name;
		this.job = job;
	}

	@Override
	public String toString() {
		return "Person [name=" + name + ", job=" + job + "]";
	}

	@Override
	public void writeExternal(ObjectOutput out) throws IOException {
		// TODO Auto-generated method stub
		out.writeUTF(name);
		out.writeUTF(job);
	}

	@Override
	public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
		// TODO Auto-generated method stub
		name = in.readUTF();
//		job = in.readUTF();
	}
    
	
}
public class SerializationTest2 {

	public static void main(String[] args) {
		
		Person2 personLee = new Person2("이순신", "대표이사");
		Person2 personKim = new Person2("김유신", "상무이사");
		
//		직렬화
		try (FileOutputStream fos = new FileOutputStream("serial.txt");
				ObjectOutputStream oos = new ObjectOutputStream(fos)){
			
			oos.writeObject(personLee);
			oos.writeObject(personKim);
		} catch (Exception e) {
			// TODO: handle exception
			System.out.println(e.getMessage());
		}
		
//		복원
		try (FileInputStream fis = new FileInputStream("serial.txt");
				ObjectInputStream ois = new ObjectInputStream(fis)){
			
			Person2 pLee =  (Person2) ois.readObject();
			Person2 pKim =  (Person2) ois.readObject();
			
			System.out.println(pLee);
			System.out.println(pKim);
		} catch (Exception e) {
			// TODO: handle exception
			System.out.println(e.getMessage());
		}
	}
}

 

반응형

'언어 > JAVA' 카테고리의 다른 글

데코레이터 패턴  (0) 2021.05.23
입출력 클래스(File, RandomAccessFile)  (0) 2021.05.23
여러가지 보조 스트림 클래스  (0) 2021.05.23
문자단위 입출력 스트림  (0) 2021.05.23
OutputSteam (출력 스트림)  (0) 2021.05.23