복붙노트

[REDIS] 레디 스 직렬화 및 역 직렬화

REDIS

레디 스 직렬화 및 역 직렬화

나는 레디 스에 저장 내 직렬화 된 오브젝트의 일부가 직렬화 복원 문제가있는 것으로 나타났습니다.

내가 레디 스에 저장된 객체 클래스의 존재를 변경할 때 일반적으로 발생합니다.

나는 솔루션에 대한 명확한 디자인을 가질 수 있도록 문제를 이해하고 싶습니다.

내 질문은, 어떻게 직렬화 문제가 발생합니까? 문제 원인 공용 / 개인 재산의 제거겠습니까? 아마도, 새 속성을 추가? 클래스에 추가하는 새로운 기능은 문제를 일으킬까요? 어떻게 더 생성자는 어떻습니까?

내 직렬화 된 객체에, 나는 속성지도, myObject에 (일부 속성, 추가 기능 등 업데이트) I 변화, 그것은 직렬화 문제가 어떤 원인이있는 경우가?

해결법

  1. ==============================

    1.무엇 직렬화 문제의 원인은?

    무엇 직렬화 문제의 원인은?

    나는 당신의 질문에 대답하기 전에 배경의 비트주고 싶습니다

    직렬화 중에 사용되는 serialVersionUID라고 불리는 각 직렬화 클래스 버전 번호와 직렬화 런타임 동료 직렬화 된 오브젝트의 송신자와 수신자가 직렬화에 대해 호환되는 오브젝트로드 클래스를 확인한다. 수신기는 대응하는 송신기의 클래스의 상이한의 serialVersionUID를 갖는 오브젝트에 대한 클래스를로드하면, 직렬화 인해 InvalidClassException가 발생할 것이다.

    직렬화 가능 클래스가 명시 적으로 serialVersionUID를 선언하지 않는 경우, 직렬화 런타임이 클래스의 다양한 측면을 기준으로 그 클래스에 대한 기본 serialVersionUID의 값을 계산합니다, 그것은 클래스의 다음과 같은 정보가 SerialVersionUID를 계산하기 위해 사용하는,

    따라서, 귀하의 질문에 대답하기 위해,

    문제 원인 공용 / 개인 재산의 제거겠습니까? 아마도, 새 속성을 추가? 클래스에 추가하는 새로운 기능은 문제를 일으킬까요? 어떻게 더 생성자는 어떻습니까?

    네, 기본적으로 모든 이러한 추가 / 제거는 문제의 원인이됩니다.

    그러나 이것을 극복하는 한 가지 방법은 명시 적으로 SerialVersionUID를 정의하는 것입니다, 이것은 내가 클래스가 시간이 지남에 따라 진화 (또는 진화) 알고 및 오류가 발생하지 않도록 직렬화 시스템을 알려드립니다. 탈 직렬화 시스템 측과 할당 값 모두에 존재하는 필드 만 판독 그래서. 탈 직렬화 측에 새로 추가 된 필드는 기본 값을 얻을 것이다. 일부 필드는 직렬화 복원 측에서 삭제 된 경우, 알고리즘은 읽고 건너 뜁니다.

    방법의 하나가 SerialVersionUID를 선언 할 수 있습니다 다음,

    private static final long serialVersionUID = 3487495895819393L;
    
  2. from https://stackoverflow.com/questions/30795262/redis-serialization-and-deserialization by cc-by-sa and MIT license