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
Related Posts
- Java - Unsupported class file major version 61 에러
- Java - String.matches()로 문자열 패턴 확인 및 다양한 예제 소개
- Java - 문자열 공백제거 (trim, replace)
- Java - replace()와 replaceAll()의 차이점
- Java - ArrayList 초기화, 4가지 방법
- Java - 배열 정렬(Sorting) (오름차순, 내림차순)
- Java - 문자열(String)을 비교하는 방법 (==, equals, compare)
- Java - StringBuilder 사용 방법, 예제
- Java - 로그 출력, 파일 저장 방법 (Logger 라이브러리)
- Java IllegalArgumentException 의미, 발생 이유
- Java - NullPointerException 원인, 해결 방법
- Seleninum의 ConnectionFailedException: Unable to establish websocket connection 해결
- Java - compareTo(), 객체 크기 비교
- Java - BufferedWriter로 파일 쓰기
- Java - BufferedReader로 파일 읽기
- Java charAt() 함수 알아보기
- Java - BigInteger 범위, 비교, 연산, 형변환
- Java contains()로 문자(대소문자 X) 포함 확인
- Java - Set(HashSet)를 배열로 변환
- Java - 문자열 첫번째 문자, 마지막 문자 확인
- Java - 문자열 한글자씩 자르기
- Java - 문자열 단어 개수 가져오기
- Java - 1초마다 반복 실행
- Java - 배열을 Set(HashSet)로 변환
- Java - 여러 Set(HashSet) 합치기
- Java - 명령행 인자 입력 받기
- Java - 리스트 역순으로 순회, 3가지 방법
- Java - 특정 조건으로 리스트 필터링, 3가지 방법
- Java - HashMap 모든 요소들의 합계, 평균 계산
- Java - 특정 조건으로 HashMap 필터링
- Java - 싱글톤(Singleton) 패턴 구현
- Java - 숫자 왼쪽에 0으로 채우기
- Java - String 배열 초기화 방법
- Java - 정렬된 순서로 Map(HashMap) 순회
- Java - HashMap에서 key, value 가져오기