본문 바로가기

명사 美 비격식 (무리 중에서) 아주 뛰어난[눈에 띄는] 사람[것]

JAVA

Serializable 인터페이스 직렬화 ObjectOutputStream, 역직렬화 ObjectInputStream와 각 메서드: 인터페이스 구현, 반환 defaultReadObject() read() readBoolean() readByte() readChar() readDouble() readFloat() readInt() readLong() readS..


Serializable 인터페이스
자바에서 직렬화를 수행한다.

https://standout.tistory.com/1507

 

직렬화란? 데이터 저장, 네트워크 데이터 통신

직렬화 데이터 저장, 네트워크 데이터 통신 데이터나 객체를 일련의 바이트로 변환하는 프로세스 데이터를 파일에 저장하거나 네트워크를 통해 전송할수 있게 한다. Java에서는 Serializable 인터페

standout.tistory.com

 

 

 

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로 인코딩된 문자열 "안녕하세요"가 기록됩니다.