Couchbase .NET SDK 2.1.0에 도입된 새로운 기능 중 하나는 기본 직렬화기를 사용자 정의 직렬화기로 재정의하고 ITypeSerializer 인터페이스를 확장하여 자신만의 또는 선호하는 직렬화기를 제공하는 기능입니다. 이 문서에서는 이 작업을 수행하는 방법을 보여주고 예제( 카우치베이스-넷-기고 프로젝트의 카우치바스랩)라는 매우 빠른 JSON 직렬화기를 사용합니다.

기본적으로 .NET SDK는 기능이 완벽하고 널리 사용되며 잘 지원되는 프로젝트이기 때문에 주로 인기 있는 NewtonSoft.NET JSON 직렬화기를 사용합니다. 일반적으로 뉴턴소프트가 제공하는 성능은 대부분의 프로젝트에 충분하지만, 경우에 따라서는 다음과 같은 더 빠른 JSON 직렬화기를 사용하고 싶을 수도 있습니다. Jil.

Jil은 장애가 없는 빠른 IL 생성 라이브러리인 Sigil을 기반으로 하며, 고도로 최적화된 범용 JSON 직렬화기를 제공하며, 성능 향상을 위해 여러 가지 '트릭'을 사용하여 할당(따라서 GC가 필요 없음)을 피하고 멤버 액세스 순서를 최적화하여 CPU가 메모리에서 값을 기다리는 동안 멈출 필요가 없도록 하는 등 여러 가지 '트릭'을 사용합니다. 질과 시길에 대해 자세히 알아보세요. 여기 그리고 여기.

필요한 단계

기본 직렬화기를 확장하는 것은 비교적 쉽습니다:

  1. 먼저 Couchbase.Core.Serializaton.ITypeSerializer의 자체 구현을 제공해야 합니다.
  2. 그런 다음 Couchbase.Configuration.Client.ClientConfiguration 클래스에서 DefaultSerializer를 재정의합니다. 그게 다입니다!
  3. 선택적으로 Web.Config 또는 App.Config를 사용하여 새 ITypeSerializer를 등록하여 SerializerFactory가 런타임에 직렬화기를 생성하도록 할 수 있습니다.

ITypeSerializer 구현하기

ITypeSerializer 인터페이스는 멤캐시드 패킷 본문의 직렬화 및 역직렬화를 처리하기 위해 트랜스코더(ITypeTranscoder)에서 사용됩니다. 트랜스코더는 연산 일반 파라미터의 Type, 연산의 OperationCode, Memcached 헤더 내에 인코딩된 "플래그"를 사용해 본문을 직렬화 해제할 Type을 결정하고 직렬화 중에 패킷을 인코딩할 플래그를 결정합니다.

본문 유형이 객체 또는 프리미티브(int, ulong 등)인 경우 본문은 JSON 플래그로 인코딩되어 JSON으로 처리됩니다. 예, 정수는 유효한 JSON으로 처리됩니다! 본문 유형이 문자열인 경우 문자열로 취급되어 UTF 8로 인코딩 또는 디코딩됩니다. 마지막으로 바이트 배열은 바로 전달되어 패킷에 추가되거나 패킷에서 읽혀지고, 연산에 본문이 있는 경우 IOperationResult의 Value 필드에 할당됩니다. 따라서 문자열과 바이트 배열 이외의 모든 값은 ITypeSerializer를 사용하여 직렬화 또는 역직렬화됩니다.

ITypeSerializer에는 구현해야 하는 다음과 같은 메서드 서명이 있습니다:

역직렬화에 대한 하나의 오버로드는 스트림과 바이트 배열, 오프셋 및 길이를 받습니다. Serialize는 전송을 위해 바이트 배열로 직렬화할 값인 System.Object 참조만 받습니다.

JilSerializer의 코드 목록은 다음과 같습니다:

직렬화 메커니즘은 다르지만 규칙은 동일합니다. 이 코드는 Newtonsoft.NET 직렬화 클래스 대신 Jil JSON 클래스를 사용한다는 점을 제외하면 DefaultSerializer 로직과 거의 동일하다는 점에 유의하세요.

사용자 정의 직렬화기를 사용하도록 SDK 구성하기

앞서 언급했듯이 2.1.0에서 사용자 정의 직렬화기를 사용할 수 있도록 Couchbase .NET SDK가 업데이트되었으며, 이는 ClientConfiguration에서 기본 직렬화기 팩토리를 재정의하는 방식으로 수행되며, 이는 단지 Func 속성인 서명과 일치하는 모든 것이 생성되어 직렬화에 사용될 것입니다. 참고로, 직렬화 설정과 역직렬화 설정은 더 이상 사용되지 않으며 더 이상 사용되지 않습니다.

다음은 그 예입니다:

ITypeSerializer 생성을 위해 복잡한 로직을 제공할 수도 있지만, 가장 간단한 접근 방식으로도 충분합니다.

직렬화 팩토리를 사용하여 직렬화기를 인스턴스화하려면 Web.Config 또는 App.Config에 초기화 코드를 제공하면 됩니다:

코드에서 사용자 지정 구성을 사용하려면 구성과 일치하는 문자열 경로를 취하는 Cluster 클래스의 CTOR를 호출합니다:

이렇게 하면 클러스터 개체에서 열린 모든 버킷은 기본 NewtonSoft.NET 직렬화기 대신 JilSerializer를 사용합니다.

결론

Couchbase .NET SDK에 새로운 확장 포인트가 추가되었으므로 ITypeSerializer 인터페이스를 사용하여 사용자 정의 JSON 직렬화기를 작성하고 사용하는 것이 간단해졌습니다. Jil JSON 직렬화기는 인상적이고 사용하기 쉬워 보입니다. 커뮤니티 멤버가 ServiceStack.Text용 직렬화기를 만들어서 Couchbase. NET 기여 프로젝트에 기여해 주셨으면 합니다!

작성자

게시자 Jeff Morris, 수석 소프트웨어 엔지니어, Couchbase

Jeff Morris는 Couchbase의 수석 소프트웨어 엔지니어입니다. Couchbase에 입사하기 전에는 6년 동안 Source Interlink에서 엔터프라이즈 웹 아키텍트로 근무했습니다. Jeff는 Couchbase SDK 개발과 N1QL(쿼리 언어)과 통합하는 방법을 담당하고 있습니다.

댓글 남기기