다음을 통해 공유


직렬 변환기를 선택합니다

BinaryFormatter에 대해 대체되는 드롭은 없지만, .NET 형식을 직렬화하기 위해 권장되는 다양한 직렬 변환기가 있습니다. 새 직렬 변환기와 통합하려면 변경이 필요하며, 이는 어떤 직렬 변환기를 선택하든 그렇습니다. 이러한 마이그레이션에서는 선택한 직렬화 도구를 사용하여 기존 형식을 가능한 한 적은 변경으로 처리하도록 강제하는 것과 선택한 직렬화 도구에 맞게 형식을 리팩터링하여 관용적인 직렬화를 가능하게 하는 것 사이에서의 절충을 고려해야 합니다. 직렬 변환기가 선택되면 모범 사례를 위해 해당 설명서를 연구해야 합니다.

이진 직렬화 형식이 필수가 아니라면, JSON 또는 XML 직렬화 형식을 고려해 볼 수 있습니다. 이러한 직렬 변환기는 공식적으로 지원되며, .NET에 포함됩니다.

  1. System.Text.Json을 사용하는 JSON
  2. System.Runtime.Serialization.DataContractSerializer을(를) 사용하는 XML

시나리오에서 압축 이진 표현이 중요한 경우 다음 serialization 형식 및 오픈 소스 serializer를 사용하는 것이 좋습니다.

  1. C#용 MessagePack을 사용하는 MessagePack
  2. protobuf-net을 사용하는 프로토콜 버퍼

직렬화된 형식의 API 셰이프를 변경할 수 있는지 여부는 직렬화에 대한 방향과 접근 방식에 영향을 줍니다. 새 특성으로 형식에 주석을 달고, 새 생성자를 추가하고, 형식/멤버를 공용으로 만들고, 필드를 속성으로 변경하는 기능을 사용하는 이러한 직렬 변환기로의 마이그레이션은 더 간단할 수 있습니다. 이러한 기능이 없는 경우에는 사용자 지정 변환기 또는 확인자를 구현해야 최신 직렬 변환기를 사용할 수 있습니다.

기능 BinaryFormatter System.Text.Json DataContractSerializer C#용 MessagePack protobuf-net
Serialization 형식 이진(NRBF) JSON (자바스크립트 객체 표기법) XML 이진(MessagePack) 이진(프로토콜 버퍼)
압축 표현 ✔️ ✔️ ✔️
사람이 읽을 수 있는 ❌️ ✔️ ✔️ ❌️ ❌️
성능 ❌️ ✔️ ✔️ ✔️
[Serializable] 특성 지원. ✔️ ✔️
공용 형식 직렬화 ✔️ ✔️ ✔️ ✔️ ✔️
공용이 아닌 형식 직렬화 ✔️ ✔️ ✔️ ✔️(확인자 필요) ✔️
필드 직렬화 ✔️ ✔️(옵트인) ✔️ ✔️(필수 특성) ✔️(필수 특성)
공용이 아닌 필드 직렬화 ✔️ ✔️(확인자 필요) ✔️ ✔️(확인자 필요) ✔️(필수 특성)
속성 직렬화 ✔️* ✔️ ✔️ ✔️(필수 특성) ✔️(필수 특성)
읽기 전용 멤버 역직렬화 ✔️ ✔️(필수 특성) ✔️ ✔️ ✔️(매개 변수가 없는 ctor 필수)
다형 형식 계층 구조 ✔️ ✔️(필수 특성) ✔️ ✔️(필수 특성) ✔️(필수 특성)
AOT 지원 ❌️ ✔️ ✔️ ❌(계획됨)

System.Text.Json을 사용하는 JSON

JSON(JavaScript Object Notation) 형식에 대한 보안, 고성능 및 낮은 메모리 할당을 강조하는 최신 직렬 변환기가 System.Text.Json 라이브러리입니다. JSON은 광범위한 플랫폼 간 지원을 제공하며, 사람이 읽을 수 있습니다. 이진 형식만큼 압축되지는 않는 텍스트 기반 형식은 크기를 크게 줄이기 위해 압축을 활용할 수 있습니다.

Serialization은(는) 공용이 아니며 읽기 전용인 멤버를 제외하며, 이는 특성 및 생성자를 통해 특별히 처리되지 않는 한 해당합니다. 또한 System.Text.Json은 형식이 JSON으로 변환되는 방식을 보다 세세하게 제어할 수 있는 사용자 지정 직렬화 및 역직렬화를 지원하며 그 반대의 경우도 마찬가지입니다. [Serializable] 특성을 System.Text.Json이 지원하지 않습니다.

System.Text.Json(JSON)으로 마이그레이션합니다.

DataContractSerializer를 사용하는 XML

WCF(Windows Communication Foundation) 메시지에서 보낸 데이터를 직렬화하고 역직렬화하는 데 .NET Framework 3.0에서 도입된 DataContractSerializer이(가) 사용됩니다. DataContractSerializer는 특성 및 구현BinaryFormatter을 적용 한다는 의미인 [Serializable] 변환기입니다. 그러므로 이러한 직렬 변환기는 마이그레이션하는 데 최소한의 노력이 필요합니다. 하지만 알려진 형식을 미리 지정해야 합니다(그러나 기본 허용 목록에 대부분의 .NET 컬렉션 및 기본 형식이 있으므로 지정할 필요가 없습니다).

DataContractSerializer으(로)부터 마이그레이션할 때 BinaryFormatter이(가) 이러한 기능적 이점을 수반하지만, 다른 선택 사항만큼 성능이 좋거나 현대적이지는 않습니다.

DataContractSerializer(XML)로 마이그레이션합니다.

경고

DataContractSerializerNetDataContractSerializer와 혼동하지 마세요. NetDataContractSerializer는 위험한 직렬 변환기식별됩니다.

MessagePack을 사용하는 이진

MessagePack 간단한 이진 serialization 형식이므로 JSON 및 XML에 비해 메시지 크기가 더 작습니다. 오픈 소스 C#용 MessagePack 라이브러리는 성능이 뛰어나며 더 작은 데이터 크기를 위한 기본 제공 초고속 LZ4 압축을 제공합니다. 데이터 형식이 DataContractSerializer 또는 라이브러리의 고유한 특성으로 주석을 추가할 때 가장 적합합니다. AOT 환경, 읽기 전용 형식 및 멤버, 공용이 아닌 형식 및 멤버를 지원하도록 구성할 수 있습니다.

MessagePack(이진)으로 마이그레이션합니다.

protobuf-net을 사용하는 이진

protobuf-net 라이브러리는 .NET용 계약 기반 직렬화 도구로, 이진 프로토콜 버퍼 직렬화 형식을 사용합니다. API는 일반적인 .NET 패턴을 따르며 XmlSerializerDataContractSerializer와(과) 대체로 유사합니다. 이 인기 있는 라이브러리는 공용이 아닌 형식 및 필드를 처리할 수 있도록 풍부한 기능을 가지고 있지만 많은 시나리오에서 멤버에 특성을 적용해야 합니다.

protobuf-net(이진)으로 마이그레이션합니다.