투케이2K

137. (java/자바) json형식으로 직렬화 (serialize) 바이트값 포맷, 역직렬화(deserialize) 원본 데이터 확인 실시 본문

Java

137. (java/자바) json형식으로 직렬화 (serialize) 바이트값 포맷, 역직렬화(deserialize) 원본 데이터 확인 실시

투케이2K 2021. 1. 26. 08:36

/* =========================== */

[ 개발 환경 설정 ]

개발 툴 : Eclipse

개발 언어 : Java

/* =========================== */

/* =========================== */

[소스 코드]

 

package AI4;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.Arrays;

class Info_Serialize implements Serializable{
	//==== 전역변수 선언 실시 ====
	private String name = "";
	private int age = 0;
	//==== 클래스 생성자 초기화 실시 ====
	public Info_Serialize(String name, int age) {
		this.name = name;
		this.age = age;
	}
	//==== toString 반환값 재정의 실시 (json형태 포맷) ====
	@Override
	public String toString() {
		return String.format("{\"name\"=\"%s\",\"age\"=%d}", name, age);
	}
}//Serializable 클래스 종료

public class MainActivity5 {
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		System.out.println("[json형식으로 직렬화 (serialize) 바이트값 포맷, 역직렬화(deserialize) 원본 데이터 확인 실시]");
		
		/*[설 명]
		 * 1. 직렬화 - 외부 시스템과 데이터를 주고 받을 수 있도록 byte 형태로 데이터를 전송하는 것입니다 
		 * 2. 역직렬화 - byte 형태 데이터를 다시 원본 데이터로 변환하는 것입니다
		 * 3. 사용이유 - 복잡한 데이터 구조 형태라도 직렬화 조건만 지키면 간편하게 byte 형태 데이터를 주고 받을 수 있습니다
		 * 4. 조건 - 직렬화, 역직렬화를 담당하는 클래스는 반드시 Serializable 인터페이스를 상속받아야합니다
		 * 5. Info_Serialize 클래스 - 직렬화, 역직렬화를 담당하는 객체입니다
		 * 6. InputStream은 데이터 읽기, OuputStream은 데이터 쓰기를 담당합니다
		 * 7. toString - 데이터 반환 형태를 정의한 것으로 사용자가 다른 포맷 방식으로 변경할 수 있습니다
		 * 8. 자바에서 쌍따옴표를 사용하기 위해서는 [역슬래쉬 쌍따옴표 \"] 를 해주면됩니다
		 */
		
		//==== 직렬화 수행 실시 ====
		Info_Serialize info_Serialize = new Info_Serialize("twok",28);
		byte serialize_arr[] = null; //직렬화 바이트값을 담을 배열 선언
		try {
			ByteArrayOutputStream s_bs = new ByteArrayOutputStream();
			ObjectOutputStream s_os = new ObjectOutputStream(s_bs);
			s_os.writeObject(info_Serialize); //데이터 쓰기
			
			serialize_arr = s_bs.toByteArray(); //바이트값을 배열에 담습니다
			System.out.println("직렬화 [전] 데이터 : "+info_Serialize.toString());
			System.out.println("직렬화 [후] 데이터 : "+Arrays.toString(serialize_arr));
			System.out.println("");
		}
		catch(Exception e) {
			e.printStackTrace();
		}
		
		//==== 역직렬화 수행 실시 ====
		byte deserialize_arr[] = null; //역직렬화를 수행하기위해 담을 배열 선언
		deserialize_arr = Arrays.copyOf(serialize_arr, serialize_arr.length); //바이트값 복사 실시
		try {
			System.out.println("역직렬화 [전] 데이터 : "+Arrays.toString(deserialize_arr));
			ByteArrayInputStream d_bs = new ByteArrayInputStream(deserialize_arr);
			ObjectInputStream d_os = new ObjectInputStream(d_bs);
			
			Object deserialize_object = d_os.readObject(); //데이터 읽기
			Info_Serialize info_Deserialize = (Info_Serialize) deserialize_object;
			System.out.println("역직렬화 [후] 데이터 : "+info_Deserialize);
		}
		catch(Exception e) {
			e.printStackTrace();
		}
		
	}//메인 종료

}//클래스 종료


/* =========================== */

[결과 출력]

[json형식으로 직렬화 (serialize) 바이트값 포맷, 역직렬화(deserialize) 원본 데이터 확인 실시]

직렬화 [전] 데이터 : {"name"="twok","age"=28}

직렬화 [후] 데이터 : [-84, -19, 0, 5, 115, 114, 0, 18, 65, 73, 52, 46, 73, 110, 102, 111, 95, 83, 101, 114, 105, 97, 108, 105, 122, 101, 27, 24, -83, -108, -40, -66, 1, -34, 2, 0, 2, 73, 0, 3, 97, 103, 101, 76, 0, 4, 110, 97, 109, 101, 116, 0, 18, 76, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 83, 116, 114, 105, 110, 103, 59, 120, 112, 0, 0, 0, 28, 116, 0, 4, 116, 119, 111, 107]

역직렬화 [전] 데이터 : [-84, -19, 0, 5, 115, 114, 0, 18, 65, 73, 52, 46, 73, 110, 102, 111, 95, 83, 101, 114, 105, 97, 108, 105, 122, 101, 27, 24, -83, -108, -40, -66, 1, -34, 2, 0, 2, 73, 0, 3, 97, 103, 101, 76, 0, 4, 110, 97, 109, 101, 116, 0, 18, 76, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 83, 116, 114, 105, 110, 103, 59, 120, 112, 0, 0, 0, 28, 116, 0, 4, 116, 119, 111, 107]

역직렬화 [후] 데이터 : {"name"="twok","age"=28}

/* =========================== */

/* =========================== */

[요약 설명]

* 1. 직렬화 - 외부 시스템과 데이터를 주고 받을 수 있도록 byte 형태로 데이터를 전송하는 것입니다

* 2. 역직렬화 - byte 형태 데이터를 다시 원본 데이터로 변환하는 것입니다

* 3. 사용이유 - 복잡한 데이터 구조 형태라도 직렬화 조건만 지키면 간편하게 byte 형태 데이터를 주고 받을 수 있습니다

* 4. 조건 - 직렬화, 역직렬화를 담당하는 클래스는 반드시 Serializable 인터페이스를 상속받아야합니다

* 5. Info_Serialize 클래스 - 직렬화, 역직렬화를 담당하는 객체입니다

* 6. InputStream은 데이터 읽기, OuputStream은 데이터 쓰기를 담당합니다

* 7. toString - 데이터 반환 형태를 정의한 것으로 사용자가 다른 포맷 방식으로 변경할 수 있습니다

* 8. 자바에서 쌍따옴표를 사용하기 위해서는 [역슬래쉬 쌍따옴표 \"] 를 해주면됩니다

/* =========================== */

반응형
Comments