바이트 어레이에 대한 Java 시리얼화 가능 객체
예를 들어 직렬화 가능한 클래스가 있다고 가정해 봅시다.AppMessage
.
다음과 같이 전송하고 싶습니다.byte[]
소켓을 통해 수신된 바이트에서 재구축되는 다른 머신으로 이동합니다.
어떻게 하면 이런 일을 할 수 있을까요?
송신할 바이트 배열을 준비합니다.
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream out = null;
try {
out = new ObjectOutputStream(bos);
out.writeObject(yourObject);
out.flush();
byte[] yourBytes = bos.toByteArray();
...
} finally {
try {
bos.close();
} catch (IOException ex) {
// ignore close exception
}
}
바이트 배열에서 개체를 만듭니다.
ByteArrayInputStream bis = new ByteArrayInputStream(yourBytes);
ObjectInput in = null;
try {
in = new ObjectInputStream(bis);
Object o = in.readObject();
...
} finally {
try {
if (in != null) {
in.close();
}
} catch (IOException ex) {
// ignore close exception
}
}
그것을 하는 가장 좋은 방법은SerializationUtils
Apache Commons Lang에서.
직렬화 방법:
byte[] data = SerializationUtils.serialize(yourObject);
역직렬화 방법:
YourObject yourObject = SerializationUtils.deserialize(data)
앞에서 설명한 바와 같이 Commons Lang 라이브러리가 필요합니다.그래들을 사용하여 가져올 수 있습니다.
compile 'org.apache.commons:commons-lang3:3.5'
메이븐:
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.5</version>
</dependency>
그리고 여기에 언급된 더 많은 방법들
또는 전체 컬렉션을 가져올 수도 있습니다.이 링크를 참조해 주세요.
Java > = 7을 사용하는 경우 리소스로 시도하여 승인된 솔루션을 개선할 수 있습니다.
private byte[] convertToBytes(Object object) throws IOException {
try (ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream out = new ObjectOutputStream(bos)) {
out.writeObject(object);
return bos.toByteArray();
}
}
그 반대는 다음과 같습니다.
private Object convertFromBytes(byte[] bytes) throws IOException, ClassNotFoundException {
try (ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
ObjectInputStream in = new ObjectInputStream(bis)) {
return in.readObject();
}
}
Serialization Utils, Apache Utils의 serialize & deserialize 메서드를 사용하여 오브젝트를 바이트[] 및 그 반대로 변환할 수 있습니다(@uris answer 참조).
직렬화를 통해 개체를 바이트[]로 변환하려면:
byte[] data = SerializationUtils.serialize(object);
역직렬화를 통해 바이트[]를 개체로 변환하려면:
Object object = (Object) SerializationUtils.deserialize(byte[] data)
Download org-apache-commons-lang.jar 링크를 클릭합니다.
다음을 클릭하여 .jar 파일을 통합합니다.
[파일명] -> [메듈 설정]를 엽니다.-> 모듈을 선택합니다.-> 의존관계 -> Jar 파일 추가가 완료됩니다.
이게 도움이 됐으면 좋겠다.
Serialization Utils 툴도 사용할 것을 권장합니다.저는 @Abilash의 잘못된 코멘트에 대해 ajust를 하고 싶습니다.그SerializationUtils.serialize()
method는 1024바이트로 제한되지 않으며, 여기서의 다른 답변과는 다릅니다.
public static byte[] serialize(Object object) {
if (object == null) {
return null;
}
ByteArrayOutputStream baos = new ByteArrayOutputStream(1024);
try {
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(object);
oos.flush();
}
catch (IOException ex) {
throw new IllegalArgumentException("Failed to serialize object of type: " + object.getClass(), ex);
}
return baos.toByteArray();
}
언뜻 보면 이렇게 생각할지도 모른다.new ByteArrayOutputStream(1024)
고정 크기만 허용합니다.하지만 자세히 보시면ByteArrayOutputStream
필요에 따라 스트림이 커지는 것을 알 수 있습니다.
이 클래스는 데이터를 바이트 배열에 쓰는 출력 스트림을 구현합니다.버퍼는 데이터가 입력되면 자동으로 커집니다.데이터는 다음 방법으로 검색할 수 있습니다.
toByteArray()
그리고.toString()
.
또 다른 흥미로운 방법은com.fasterxml.jackson.databind.ObjectMapper
byte[] data = new ObjectMapper().writeValueAsBytes(JAVA_OBJECT_HERE)
메이븐 의존 관계
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
스프링을 이용하시는 분은 스프링코어로 이용하실 수 있는 유틸리티 클래스가 있습니다.간단히 할 수 있다
import org.springframework.util.SerializationUtils;
byte[] bytes = SerializationUtils.serialize(anyObject);
Object object = SerializationUtils.deserialize(bytes);
바이트[] over 소켓으로 다른 기계에 전송하고 싶습니다.
// When you connect
ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
// When you want to send it
oos.writeObject(appMessage);
수신한 바이트로부터 재구축됩니다.
// When you connect
ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
// When you want to receive it
AppMessage appMessage = (AppMessage)ois.readObject();
스프링 프레임워크org.springframework.util.SerializationUtils
byte[] data = SerializationUtils.serialize(obj);
종속성이 없는 멋진 복사 붙여넣기 솔루션을 원하는 경우.아래 코드를 잡으세요.
예
MyObject myObject = ...
byte[] bytes = SerializeUtils.serialize(myObject);
myObject = SerializeUtils.deserialize(bytes);
원천
import java.io.*;
public class SerializeUtils {
public static byte[] serialize(Serializable value) throws IOException {
ByteArrayOutputStream out = new ByteArrayOutputStream();
try(ObjectOutputStream outputStream = new ObjectOutputStream(out)) {
outputStream.writeObject(value);
}
return out.toByteArray();
}
public static <T extends Serializable> T deserialize(byte[] data) throws IOException, ClassNotFoundException {
try(ByteArrayInputStream bis = new ByteArrayInputStream(data)) {
//noinspection unchecked
return (T) new ObjectInputStream(bis).readObject();
}
}
}
이것은, 실가동시에 사용하는 경우에 대비해, 받아들여진 회답의 최적화된 코드 형식입니다.
public static void byteArrayOps() throws IOException, ClassNotFoundException{
String str="123";
byte[] yourBytes = null;
// Convert to byte[]
try(ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream out = new ObjectOutputStream(bos);) {
out.writeObject(str);
out.flush();
yourBytes = bos.toByteArray();
} finally {
}
// convert back to Object
try(ByteArrayInputStream bis = new ByteArrayInputStream(yourBytes);
ObjectInput in = new ObjectInputStream(bis);) {
Object o = in.readObject();
} finally {
}
}
Java 8+에서의 코드 예시:
public class Person implements Serializable {
private String lastName;
private String firstName;
public Person() {
}
public Person(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getFirstName() {
return firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
@Override
public String toString() {
return "firstName: " + firstName + ", lastName: " + lastName;
}
}
public interface PersonMarshaller {
default Person fromStream(InputStream inputStream) {
try (ObjectInputStream objectInputStream = new ObjectInputStream(inputStream)) {
Person person= (Person) objectInputStream.readObject();
return person;
} catch (IOException | ClassNotFoundException e) {
System.err.println(e.getMessage());
return null;
}
}
default OutputStream toStream(Person person) {
try (OutputStream outputStream = new ByteArrayOutputStream()) {
ObjectOutput objectOutput = new ObjectOutputStream(outputStream);
objectOutput.writeObject(person);
objectOutput.flush();
return outputStream;
} catch (IOException e) {
System.err.println(e.getMessage());
return null;
}
}
}
언급URL : https://stackoverflow.com/questions/2836646/java-serializable-object-to-byte-array
'sourcecode' 카테고리의 다른 글
vuex 계산 속성이 무효가 아님 (0) | 2022.08.08 |
---|---|
VuexFire 돌연변이 (0) | 2022.08.08 |
JWT 토큰 유효성 검사 - beforeEnter (0) | 2022.08.08 |
Vue에서 JSON 데이터에 대한 드롭다운 필터 생성 (0) | 2022.08.08 |
Vuex 배열에서 항목 제거 (0) | 2022.08.08 |