Java - Object를 byte[]로 변환

Java에서 객체(Object)를 byte 배열로 변환하거나, 반대로 byte 배열을 객체(Object)로 변환하는 방법을 소개합니다.

주의할 점은 변환하려는 Object의 클래스는 Serializable 인터페이스를 구현해야합니다.

1. ByteArrayOutputStream, ObjectOutputStream

ByteArrayOutputStream, ObjectOutputStream를 사용하여 Object를 byte 배열로 변환하거나, 반대로 byte 배열을 Object로 변환할 수 있습니다.

Object to bytes

public static byte[] convertObjectToBytes(Object obj) throws IOException {
    ByteArrayOutputStream boas = new ByteArrayOutputStream();
    try (ObjectOutputStream ois = new ObjectOutputStream(boas)) {
        ois.writeObject(obj);
        return boas.toByteArray();
    }
}

bytes to Object

public static Object convertBytesToObject(byte[] bytes)
        throws IOException, ClassNotFoundException {
    InputStream is = new ByteArrayInputStream(bytes);
    try (ObjectInputStream ois = new ObjectInputStream(is)) {
        return ois.readObject();
    }
}

Example

User 객체를 byte 배열로 변환하고, 다시 byte 배열을 User 객체로 변환하는 예제입니다. 주의할 점은 변환하려는 Object의 클래스는 Serializable 인터페이스를 구현합니다.

import java.io.*;

public class ConvertObjectToBytes {

    public static void main(String[] args) throws IOException, ClassNotFoundException {
        User user = new User("John");
        byte[] bytes = convertObjectToBytes(user);

        User converted = (User) convertBytesToObject(bytes);
        System.out.println(converted);
    }

    public static byte[] convertObjectToBytes(Object obj) throws IOException {
        ByteArrayOutputStream boas = new ByteArrayOutputStream();
        try (ObjectOutputStream ois = new ObjectOutputStream(boas)) {
            ois.writeObject(obj);
            return boas.toByteArray();
        }
    }

    public static Object convertBytesToObject(byte[] bytes)
            throws IOException, ClassNotFoundException {
        InputStream is = new ByteArrayInputStream(bytes);
        try (ObjectInputStream ois = new ObjectInputStream(is)) {
            return ois.readObject();
        }
    }

    public static class User implements Serializable {
        private String name;

        public User(String name) {
            this.name = name;
        }

        @Override
        public String toString() {
            return "User{name=" + name +  "}";
        }
    }
}

Output:

User{name=John}

NotSerializableException

만약 아래와 같이 User 클래스가 Serializable 인터페이스를 구현하지 않으면 NotSerializableException 에러가 발생합니다.

public static class User {
    private String name;

    public User(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "User{name=" + name +  "}";
    }
}

Output:

Exception in thread "main" java.io.NotSerializableException: ConvertObjectToBytes$User
	at java.base/java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1193)
	at java.base/java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:353)
	at ConvertObjectToBytes.convertObjectToBytes(ConvertObjectToBytes.java:16)
	at ConvertObjectToBytes.main(ConvertObjectToBytes.java:7)

2. Apache Commons Lang

Apache Commons Lang 라이브러리에서 byte 배열을 Object로 변환하거나, 반대로 변환하는 API들을 제공합니다. 이 라이브러리를 사용하면 직접 구현하지 않고 간단히 사용할 수 있습니다.

Dependency

Maven 프로젝트라면 다음과 같이 라이브러리에 대한 의존성을 설정할 수 있습니다.

<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.0</version>
</dependency>

Object to bytes

SerializationUtils.serialize()는 Object를 byte[]로 변환합니다.

byte[] bytes = SerializationUtils.serialize(user);

bytes to Object

SerializationUtils.deserialize()byte[]를 Object로 변환합니다.

User converted = (User) SerializationUtils.deserialize(bytes);

Example

라이브러리를 이용하여 Object를 byte 배열로, byte 배열을 Object로 변환하는 예제입니다. 주의할 점은 변환하려는 Object의 클래스는 Serializable 인터페이스를 구현해야합니다.

import org.apache.commons.lang3.SerializationUtils;

import java.io.*;

public class ConvertObjectToBytes2 {

    public static void main(String[] args) throws IOException, ClassNotFoundException {
        User user = new User("John");
        byte[] bytes = SerializationUtils.serialize(user);

        User converted = (User) SerializationUtils.deserialize(bytes);
        System.out.println(converted);
    }

    public static class User implements Serializable {
        private String name;

        public User(String name) {
            this.name = name;
        }

        @Override
        public String toString() {
            return "User{name=" + name +  "}";
        }
    }
}

Output:

User{name=John}

References

Loading script...

Related Posts

codechachaCopyright ©2019 codechacha