직렬 변환기를 선택합니다
BinaryFormatter에 대해 대체되는 드롭은 없지만, .NET 형식을 직렬화하기 위해 권장되는 다양한 직렬 변환기가 있습니다. 새 직렬 변환기와 통합하려면 변경이 필요하며, 이는 어떤 직렬 변환기를 선택하든 그렇습니다. 이러한 마이그레이션 중에는 새 직렬 변환기를 강제 변환함으로써 선택한 직렬 변환기를 사용하여 관용적 serialization 를 사용하도록 설정하기 위해 가능한 한 적은 변경 내용으로 기존 형식을 처리하도록 하는 것과 리팩터링 형식 간의 절충을 고려해야 합니다. 직렬 변환기가 선택되면 모범 사례를 위해 해당 설명서를 연구해야 합니다.
JSON 또는 XML serialization 형식을 이진 serialization 형식이 요구 사항이 아닌 경우에 사용하는 것이 좋습니다. 이러한 직렬 변환기는 공식적으로 지원되며, .NET에 포함됩니다.
- System.Text.Json을 사용하는 JSON
System.Runtime.Serialization.DataContractSerializer
을(를) 사용하는 XML
다음과 같은 serialization 형식 및 오픈 소스 직렬 변환기를 시나리오에서 압축 이진 표현이 중요한 경우에 사용하는 것이 권장됩니다.
- C#용 MessagePack을 사용하는 MessagePack
- protobuf-net을 사용하는 프로토콜 버퍼
serialization에 대한 방향과 접근 방식에 직렬화된 형식의 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은(는) 공용이 아니며 읽기 전용인 멤버를 제외하며, 이는 특성 및 생성자를 통해 특별히 처리되지 않는 한 해당합니다. 또한 형식이 JSON으로 변환되는 방식을 보다 세세하게 제어할 수 있는 사용자 지정 serialization 및 역직렬화를 System.Text.Json이 지원하며 그 반대의 경우도 마찬가지입니다. [Serializable]
특성을 System.Text.Json이 지원하지 않습니다.
System.Text.Json(JSON)으로 마이그레이션합니다.
DataContractSerializer를 사용하는 XML
WCF(Windows Communication Foundation) 메시지에서 보낸 데이터를 직렬화하고 역직렬화하는 데 .NET Framework 3.0에서 도입된 DataContractSerializer이(가) 사용됩니다. DataContractSerializer 은(는) XML 직렬 변환기로, 는 BinaryFormatter
에 사용되는 serialization 프로그래밍 모델을 완전히 지원하며, 이는 [Serializable]
특성 및 ISerializable에 대한 구현을 적용한다는 의미입니다. 그러므로 이러한 직렬 변환기는 마이그레이션하는 데 최소한의 노력이 필요합니다. 하지만 알려진 형식을 미리 지정해야 합니다(그러나 기본 허용 목록에 대부분의 .NET 컬렉션 및 기본 형식이 있으므로 지정할 필요가 없습니다).
BinaryFormatter으(로)부터 마이그레이션할 때 DataContractSerializer
이(가) 이러한 기능적 이점을 수반하지만, 다른 선택 사항만큼 성능이 좋거나 현대적이지는 않습니다.
DataContractSerializer(XML)로 마이그레이션합니다.
Warning
DataContractSerializer를 NetDataContractSerializer와 혼동하지 마세요. NetDataContractSerializer는 위험한 직렬 변환기로 식별됩니다.
MessagePack을 사용하는 이진
압축된 이진 serialization 형식인 MessagePack은 JSON 및 XML에 비해 메시지 크기가 더 작습니다. 오픈 소스 C#용 MessagePack 라이브러리는 성능이 뛰어나며 더 작은 데이터 크기를 위한 기본 제공 초고속 LZ4 압축을 제공합니다. 데이터 형식이 DataContractSerializer
또는 라이브러리의 고유한 특성으로 주석을 추가할 때 가장 적합합니다. AOT 환경, 읽기 전용 형식 및 멤버, 공용이 아닌 형식 및 멤버를 지원하도록 구성할 수 있습니다.
protobuf-net을 사용하는 이진
이 protobuf-net 라이브러리는 .NET용 계약 기반 직렬 변환기로, 이진 프로토콜 버퍼serialization 형식을 사용합니다. API는 일반적인 .NET 패턴을 따르며 XmlSerializer
및 DataContractSerializer
와(과) 대체로 유사합니다. 이 인기 있는 라이브러리는 공용이 아닌 형식 및 필드를 처리할 수 있도록 풍부한 기능을 가지고 있지만 많은 시나리오에서 멤버에 특성을 적용해야 합니다.
.NET