직렬화 & 역직렬화

2025. 1. 5. 02:42·Langauge/Java

 

❐ Description


Redis를 사용할 때 데이터를 저장/조회 하는 과정에서 직렬화와 역직렬화는 필수적으로 이루어진다.

그래서 오늘은 Java의 직렬화 & 역직렬화 부터 다시 알아보고, 순서대로 SpringBoot, Redis에서

직렬화와 역직렬화를 할 수 있는 방법에 대해서 공부하자.

 

 

 

 

 

❐ Java에서 직렬화 & 역직렬화 사용하기


우선 자바 직렬화를 사용하기 위해선 아래의 functionalInterface를 사용해야 한다.

package org.springframework.core.serializer;

@FunctionalInterface
public interface Serializer<T> {...}

 

위 인터페이스를 정의해줘야 하는 이유는 아래의 코드에서 확인할 수 있다.

@Override
public void serialize(Object object, OutputStream outputStream) throws IOException {
    // 🔥 Serializable 확장 여부 확인
    if (!(object instanceof Serializable)) {
        throw new IllegalArgumentException(getClass().getSimpleName() + " requires a Serializable payload " +
                "but received an object of type [" + object.getClass().getName() + "]");
    }
    ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream);
    objectOutputStream.writeObject(object);
    objectOutputStream.flush();
}

 

 

 

 

 

❐ Java 직렬화 & 역직렬화 문제점


이펙티브 자바 읽은 후 정리

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

❐ Java 직렬화의 대체 기술 (Jackson 라이브러리)


Jackson을 사용하기 위해서는 우선 의존성을 설정해야 하고, ObjectMapper를 사용하게 된다.

implementation("com.fasterxml.jackson.core:jackson-databind:2.18.2")

 

🧩 java object ⇨ json ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

@Test
void objectMapperTest1() throws JsonProcessingException {
    // given
    Member member = Member.newOne(UUID.randomUUID(), "gilbert");

    // when
    ObjectMapper objectMapper = new ObjectMapper();

    // then
    String string = objectMapper.writeValueAsString(member);

    // {"id":"3cf9887d-e5bd-41ab-8bfe-672b43b86ca5","name":"gilbert"}
    System.out.println(string);
}

 

 

🧩 json ⇨ java object ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

@Test
void objectMapperTest2() throws JsonProcessingException {
    // given
    ObjectMapper objectMapper = new ObjectMapper();
    String jsonData = "{ \"id\":\"8a811c0d-b0b2-4ded-b13c-7af469878ea5\",\"name\":\"gilbert\"}";

    // when
    Member member = objectMapper.readValue(jsonData, Member.class);

    // then : id :8a811c0d-b0b2-4ded-b13c-7af469878ea5&name :gilbert
    System.out.println(member.toString());
}

 

 

이외에도 Protobuf(Protocol Buffers), Avro, Redis 전용 직렬화 클래스가 있다.

 

 

 

 

 


'Langauge > Java' 카테고리의 다른 글

Comparable, Stream을 사용하여 뱃지 부여하기  (0) 2024.10.10
Generic 제대로 알아보기.  (0) 2024.06.16
'Langauge/Java' 카테고리의 다른 글
  • Comparable, Stream을 사용하여 뱃지 부여하기
  • Generic 제대로 알아보기.
gilbert9172
gilbert9172
gilbert9172 님의 블로그 입니다.
  • gilbert9172
    バックエンド
    gilbert9172
  • 전체
    오늘
    어제
    • All Categories (207)
      • 우테코 7기 (21)
        • 1주차 (8)
        • 2주차 (5)
        • 3주차 (6)
      • Langauge (6)
        • Java (3)
        • Kotlin (3)
      • Back-End (13)
        • SpringBoot (1)
        • Trouble Shooting (0)
        • Setup & Configuration (1)
        • SQL (3)
        • Redis (8)
      • Architecture (6)
        • Multi Module (1)
        • DDD (5)
      • CS (30)
        • Data Structure (6)
        • Operating System (0)
        • Network (12)
        • Database (10)
        • Design Pattern (2)
      • Algorithm (78)
        • 내용 정리 (18)
        • 문제풀이 (60)
      • DevOps (6)
        • AWS (5)
        • Git (1)
      • Front-End (1)
        • Trouble Shooting (1)
      • Project (6)
        • 페이스콕 (6)
      • Book (39)
        • 친절한 SQL 튜닝 (9)
        • 데이터 중심 애플리케이션 설계 (14)
        • 이벤트 기반 마이크로서비스 구축 (6)
        • Spring Batch docs (10)
        • Quartz docs (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    Two-Pointer
    오블완
    binarysearch
    부분단조성
    greedy
    Back-Tracking
    sliding-window
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.2
gilbert9172
직렬화 & 역직렬화
상단으로

티스토리툴바