2014-04-17 3 views
0

지난 두 시간 동안 "JSON 직렬화 가능 아님"문제를 해결하기 위해 노력하고 있으므로 인스턴스를 직렬화 및 비 직렬화하는 동안 어려운 부분에 관심이 많습니다.JSON으로 인스턴스를 직렬화 할 수없는 이유는 무엇입니까?

JSON을 사용하여 클래스 인스턴스를 직렬화 할 수없는 이유는 무엇입니까?

직렬화하려면

  1. 참고 클래스 이름을 포장시에 변수 값을
  2. 주 (객체를 재건하기 위해).
  3. 문자열로 변환하십시오. (msgpack는 마찬가지로)
  4. 선택적

가 직렬화로 압축 :

  1. 변수
  2. 복귀 오브젝트 적절한하는 새로운 인스턴스를
  3. 할당 알려진 값을 만든다.

어려운 점은 무엇입니까? 복잡한 데이터 유형이란 무엇입니까?

+0

왜 json으로 인스턴스를 직렬화 하시겠습니까? 피클 왜 안되니? – laike9m

+0

나는 RabbitMQ + pickle을 사용하고 있습니다. 나는 pickle에 아무런 문제가 없습니다. 이제는 ZeroRPC를 사용하려고합니다. msgpack은 제 클래스 중 하나에 대해 불평합니다. 정확히 어떤 오류가 발생했는지 모르겠습니다. Msgpack은 "Json이 포장하는 모든 것을 포장합니다"라고 말합니다. Json은 내 인스턴스를 압축하지 않습니다. 승인. 나는 포기한다. 그러나 다른 serializer가 만들 수있는 동안 달성하기가 어려운 일에 매우 관심이 많습니다. – ceremcem

답변

0

은 "어려운"부분은 똑바로 앞으로 상당히입니다, 주로 당신의 직렬화의 3 단계 (직렬화 복원시에 나중에 다시와) 문자열에 포함 된 값을 변환 숫자, 문자열, 논리 값 같은 간단한 유형의

하지만, 원격 서버에 연결된 소켓이나 열린 파일 디스크립터와 같은 복잡한 유형의 경우 제대로 작동하지 않습니다.

해결 방법은 일반적으로 직렬화하려는 형식에서 복잡한 형식을 이동하고 직렬화 된 형식을 매우 깨끗하게 유지하거나, 어떤 방식으로 직렬화해야하는지 등을 serializer에 정확히 알려야합니다.

+0

확인. 열린 파일 기술자 또는 소켓 컴플렉스를 만드는 이유는 무엇입니까? 표준 데이터 유형 (int, string ...)으로 정의 할 수 없습니까? 왜 그렇게 복잡합니까? – ceremcem

+0

@ceremcem 열린 파일은 100 바이트를 읽을 수 있고 열려있는 파일 설명자를 사용하여 개체를 직렬화하여 다른 컴퓨터에 제공 할 수 있음을 나타냅니다. 다른 컴퓨터가 개체를 deserialize하고 다음 100 바이트를 읽도록 호출을 호출하면 파일이 존재하지 않을 수도 있습니다. 소켓과 같은 것; Google에 연결을 열고 검색을 보내고 소켓을 직렬화하고 다른 컴퓨터에서 몇 주 뒤 직렬화 해제하면 원본 소켓에서 보낸 답을 얻을 수 있도록 연결을 어떻게 다시 시작 하시겠습니까? –

+1

@ceremcem 기본적으로 객체 자체에 완전히 포함되지 않은 상태의 객체 (예 : OS 또는 네트워크)는 최소한 직렬로 직렬화되지 않으므로 직렬화 기가 쉽게 유지됩니다. –

관련 문제