2010-02-18 5 views
1

두 개의 응용 프로그램이 대기열을 사용하여 서로 이야기하고 있습니다. 지금은 정확히 동일한 버전의 루비 (1.8.7)를 실행하므로 객체를 앞뒤로 마샬링하고 있습니다. 표준 lib의 객체는 대부분 해시, 문자열, 시간 및 날짜 객체 만 포함합니다.서로 다른 버전의 Ruby에서 객체를 직렬화하는 빠르고 안정적인 방법이 있습니까?

지금 당장은 하나의 응용 프로그램 인 Ruby 1.9.1로 이동합니다. 즉, 한 응용 프로그램을 1.8.7로 실행하고 다른 응용 프로그램을 1.9.1로 잠시 실행합니다. 마샬은 여러 버전에서 신뢰할 수 없다는 것을 알았지 만 YAML을 사용할 수는 있지만 JSON은 속도가 더 빠르지 만 날짜/시간 객체를 직접 처리하지는 않습니다.

다른 버전에서 루비 객체를 직렬화하는 안정적이고 빠른 방법이 있습니까?

답변

0

루비에서 시도하지 않았지만 프로토콜 버퍼를 볼 수 있습니까? 빠르지 만 이식 가능한 바이너리 형식으로 설계된이 모듈은 루비 포트 here을 가지고 있습니다. 하지만 생성 된 유형을 별도의 DTO 레이어로 처리해야합니다 (예 : 기존 객체를 직렬화하는 대신 기존 데이터를 새로운 유형으로 매핑). 내장 된 날짜 - 시간 지원은 없지만 신기원에서 틱을 사용할 수 있습니다.

+0

감사합니다. 지금 검사 해 보겠습니다. 마샬의 투명성이 좋고 데이터 유형을 직접 다룰 필요가 없지만 여러 버전에서 데이터 유형을 처리 할 방법이 없다고 생각합니다. – Camilo

0

여기에서 핵심은 루비 버전에서 동일하게 나타낼 공통 데이터 유형을 찾는 것입니다. 분명한 선택은 외부 데이터베이스 (DB 인터페이스 라이브러리가 모든 변환을 처리 함)에 데이터를 저장하거나 구조화 된 텍스트 형식으로 데이터를 쓰는 것입니다. 작업 할 데이터가별로 없다면 (보통 데이터는 표준 유형입니다), 보통 텍스트로 저장합니다. 내보내기/가져 오기에는 시간이 오래 걸리지 만 일반적으로 작성하는 것이 더 빠릅니다.

+0

글쎄, 큐잉 서버에 아주 작은 메시지를주고 받고, 디스크에 쓰는 것을 피하는 것은 매우 중요하다. 나는 대부분의 메시지를 빠르게 처리 할 수있는 한 두 개의 메시지를 잃어 버리면별로 중요하지 않다. 이상적으로는 날짜 - 시간을 인식하는 JSON 기반 구현이 이상적입니다. – Camilo

+1

아, 그 경우에는 파일을 작성하는 것이 실제로 너무 많을 것입니다. JSON을 사용하지 못하도록하는 유일한 일시적인 지원이 부족합니까? 그렇다면 루비'DateTime' 객체를 오히려 신속하게 대체 표현으로 변환 할 수 있어야합니다. 나는 루비 date/time 객체를 문자열 ('DateTime.to_s'와'DateTime.strptime')을 사용하여 저장하고 정수로 ('Time.to_i'와'Time.at') 내가 중간체를 통해 그들을 깔아 줘야 할 때 저장했습니다. – bta

0

Protobufs는 좋지만 데이터 구조를 미리 정의해야합니다. Thrift는 protobufs와 비슷하지만 괜찮은 코드 생성 기능을 가지고 있습니다.

Apple의 바이너리 속성 목록 형식이 사용자의 요구에 가까운 소리를냅니다. 비헤이비어에서는 JSON과 비슷하지만 좀 더 작고 datetime 및 unencoded 바이너리를 포함한 몇 가지 추가 유형을 지원합니다. github에는 몇 가지 루비 구현이 있습니다.

가장 좋은 내기는 BERT 일 수 있습니다. BERT는 Erlang의 2 진수 직렬화 형식을 기반으로합니다. 그것은 작고 데이터 타임 직렬화를 포함하며 루비를 포함하여 12 개 정도의 언어로 구현됩니다.

관련 문제