Serializable 인터페이스
자바에서 직렬화를 수행한다.
https://standout.tistory.com/1507
Person만들기
Serializable을 implements해 인터페이스를 구현한다.
// Serializable 인터페이스를 구현한 클래스
class Person implements Serializable {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;this.age = age;
}
// Getter 및 Setter 메서드
public String getName() {return name;}
public void setName(String name) {this.name = name;}
public int getAge() { return age;}
public void setAge(int age) {this.age = age;}
}
객체 -> 데이터
Person이란 객체를 person.ser 파일에 ObjectOutputStream로 저장 writeObject() 한다.
객체 -> 데이터
person.ser 파일을 ObjectInputStream로 읽어 readObject() 출력해보자.
public class SerializationExample {
public static void main(String[] args) {
// 객체 생성
Person person = new Person("John", 30);
// 객체를 파일에 저장 (직렬화)
try {
FileOutputStream fileOut = new FileOutputStream("person.ser");
ObjectOutputStream out = new ObjectOutputStream(fileOut);
out.writeObject(person);
out.close();
fileOut.close();
System.out.println("Serialized data is saved in person.ser");
} catch (IOException i) {
i.printStackTrace();
}
// 파일에서 객체를 읽어옴 (역직렬화)
Person loadedPerson = null;
try {
FileInputStream fileIn = new FileInputStream("person.ser");
ObjectInputStream in = new ObjectInputStream(fileIn);
loadedPerson = (Person) in.readObject();
in.close();
fileIn.close();
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
// 역직렬화된 객체 출력
System.out.println("Name: " + loadedPerson.getName());
System.out.println("Age: " + loadedPerson.getAge());
}
}
writeObject(), readObject()와 같은
ObjectInputStream ObjectOutputStream의 메서드들을 더 확인해보자.
ObjectInputStream
void defaultReadObject()
현재 직렬화된 객체를 기본 직렬화 형태로 읽습니다. 해당 객체는 `Serializable` 인터페이스를 구현하고 있어야 합니다.
private void readObject(ObjectInputStream stream) throws IOException, ClassNotFoundException {
stream.defaultReadObject();
}
int read()
다음 바이트 데이터를 읽고 반환합니다.
int data = inputStream.read();
System.out.println(data); // 출력 결과: 읽은 바이트 데이터 값
int read(byte[] buf, int off, int len)
지정된 버퍼에서 len만큼의 데이터를 읽고 읽은 바이트 수를 반환합니다.
byte[] buffer = new byte[10];
int bytesRead = inputStream.read(buffer, 0, 10);
System.out.println(bytesRead); // 출력 결과: 읽은 바이트 수
boolean readBoolean()
boolean 값을 읽고 반환합니다.
boolean value = inputStream.readBoolean();
byte readByte()
byte 값을 읽고 반환합니다.
byte value = inputStream.readByte();
char readChar()
char 값을 읽고 반환합니다.
char value = inputStream.readChar();
double readDouble()
double 값을 읽고 반환합니다.
double value = inputStream.readDouble();
float readFloat()
float 값을 읽고 반환합니다.
float value = inputStream.readFloat();
int readInt()
int 값을 읽고 반환합니다.
int value = inputStream.readInt();
long readLong()
long 값을 읽고 반환합니다.
long value = inputStream.readLong();
short readShort()
short 값을 읽고 반환합니다.
short value = inputStream.readShort();
Object readObject()
객체를 읽고 반환합니다.
Object obj = inputStream.readObject();
int readUnsignedByte()
부호 없는 byte 값을 읽고 반환합니다.
보통 부호가없는 바이트파일에서 메서드가 유용하게 활용된다.
FF // 부호 없는 바이트 값으로 255를 나타내는 데이터
int value = inputStream.readUnsignedByte();
System.out.println("Read Unsigned Byte: " + value); //Read Unsigned Byte: 255
int readUnsignedShort()
부호 없는 short 값을 읽고 반환합니다.
보통 부호가없는 이진파일에서 메서드가 유용하게 활용된다.
00 01 // 부호 없는 short 값으로 1을 나타내는 데이터
int value = inputStream.readUnsignedShort();
System.out.println("Read Unsigned Short: " + value); //Read Unsigned Short: 1
Object readUnshared()
객체를 읽고 반환하며, 복사본을 생성하지 않습니다.
Object obj = inputStream.readUnshared();
String readUTF()
UTF-8 문자열을 읽고 반환합니다.
// 예시 코드
String str = inputStream.readUTF();
System.out.println("Read String: " + str);
ObjectOutputStream
void defaultWriteObject()
현재 직렬화되는 객체의 기본 필드를 기록합니다.
class MyClass implements Serializable {
private String name;
private int age;
// Constructors, getters, setters...
private void writeObject(ObjectOutputStream out) throws IOException {
out.defaultWriteObject();
}
}
[출력결과]
기록된 필드 값이 출력됩니다.
void write(byte[] buf)
바이트 배열을 출력 스트림에 기록합니다.
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("data.txt"));
byte[] data = {65, 66, 67, 68, 69};
out.write(data);
out.close();
[출력결과]
"data.txt" 파일에 다음과 같은 바이트 배열의 데이터가 기록됩니다: [65, 66, 67, 68, 69]
void write(byte[] buf, int off, int len)
바이트 배열의 지정된 오프셋에서 시작하여 지정된 길이만큼을 출력 스트림에 기록합니다.
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("data.txt"));
byte[] data = {65, 66, 67, 68, 69};
out.write(data, 1, 3); // Write bytes from index 1 to 3
out.close();
[출력결과]
"data.txt" 파일에는 바이트 배열의 인덱스 1부터 3까지의 데이터가 기록되었습니다. (값: [66, 67, 68])
void write(int val)
정수 값을 출력 스트림에 기록합니다.
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("data.txt"));
int value = 42;
out.write(value);
out.close();
[출력결과]
"data.txt" 파일에 정수 값 42가 기록됩니다.
void writeBoolean(boolean val)
부울 값을 출력 스트림에 기록합니다.
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("data.txt"));
boolean value = true;
out.writeBoolean(value);
out.close();
[출력결과]
"data.txt" 파일에 부울 값이 기록되었습니다. (값: true)
void writeByte(int val)
바이트 값을 출력 스트림에 기록합니다.
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("data.txt"));
byte value = 10;
out.writeByte(value);
out.close();
[출력결과]
"data.txt" 파일에 바이트 값이 기록되었습니다. (값: 10)
void writeBytes(String str)
문자열의 각 문자를 바이트로 변환하여 출력 스트림에 기록합니다.
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("data.txt"));
String str = "Hello";
out.writeBytes(str);
out.close();
[출력결과]
"data.txt" 파일에 문자열 "Hello"의 각 문자의 바이트 값이 기록됩니다.
void writeDouble(double val)
더블 값을 출력 스트림에 기록합니다.
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("data.txt"));
double value = 3.14;
out.writeDouble(value);
out.close();
[출력결과]
"data.txt" 파일에 더블 값 3.14가 기록됩니다.
void writeFloat(float val)
플로트 값을 출력 스트림에 기록합니다.
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("data.txt"));
float value = 3.14f;
out.writeFloat(value);
out.close();
[출력결과]
"data.txt" 파일에 플로트 값 3.14가 기록됩니다.
void writeInt(int val)
정수 값을 출력 스트림에 기록합니다.
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("data.txt"));
int value = 42;
out.writeInt(value);
out.close();
[출력결과]
"data.txt" 파일에 정수 값 42가 기록됩니다.
void writeLong(long val)
롱 값을 출력 스트림에 기록합니다.
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("data.txt"));
long value = 1234567890L;
out.writeLong(value);
out.close();
[출력결과]
"data.txt" 파일에 롱 값 1234567890이 기록됩니다.
void writeObject(Object obj)
객체를 출력 스트림에 기록합니다.
import java.io.Serializable;
import java.io.ObjectOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
class MyClass implements Serializable {
private String name;
private int age;
public MyClass(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public static void main(String[] args) throws IOException {
MyClass obj = new MyClass("John", 30);
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("data.txt"));
out.writeObject(obj);
out.close();
System.out.println("객체가 성공적으로 기록되었습니다.");
}
}
[출력결과]
"data.txt" 파일에 다음과 같은 MyClass 객체가 기록되었습니다:
MyClass[name=John, age=30]
void writeShort(int val)
숏 값을 출력 스트림에 기록합니다.
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("data.txt"));
short value = 100;
out.writeShort(value);
out.close();
[출력결과]
"data.txt" 파일에 숏 값 100이 기록됩니다.
void writeUnshared(Object obj)
직렬화할 때 새로운 참조로 객체를 출력 스트림에 기록합니다.
import java.io.Serializable;
import java.io.ObjectOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
class MyClass implements Serializable {
private String name;
private int age;
public MyClass(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public static void main(String[] args) {
MyClass obj = new MyClass("John", 30);
try (ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("data.txt"))) {
out.writeUnshared(obj);
System.out.println("객체가 성공적으로 기록되었습니다.");
} catch (IOException e) {
System.err.println("객체를 기록하는 중에 오류가 발생했습니다: " + e.getMessage());
}
}
}
[파일에서 읽어온 객체 정보]
Name: John
Age: 30
void writeUTF(String str)
UTF-8로 인코딩된 문자열을 출력 스트림에 기록합니다.
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("data.txt"));
String str = "안녕하세요";
out.writeUTF(str);
out.close();
[출력결과]
"data.txt" 파일에 UTF-8로 인코딩된 문자열 "안녕하세요"가 기록됩니다.