다음을 통해 공유


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

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

C#용 MessagePack의 일부 동작 및 기능은 특히 직렬화된 형식의 API를 변경할 수 없거나 최소화할 필요가 없는 경우 마이그레이션 BinaryFormatter하는 동안 주목할 만합니다.

  • 기본적으로 퍼블릭 형식만 직렬화 할 수 있습니다. 프라이빗 및 내부 구조체 및 클래스는 StandardResolverAllowPrivate.OptionsMessagePackSerializer.Serialize 의 인수와 MessagePackSerializer.Deserialize 메서드로 제공된 경우에만 직렬화 할 수 있습니다.

  • MessagePack을 사용하려면 직렬화할 수 있는 각 형식에 특성에 주석을 [MessagePackObject] 추가해야 합니다. 이 ContractlessStandardResolver를 사용하여 이를 방지할 수 있지만 나중에 버전 관리와 관련된 문제가 발생할 수 있습니다.

  • 직렬화할 수 있는 모든 비정적 필드와 속성은 특성으로 이 [Key] 주석을 추가해야 합니다. 특성으로 형식에 주석을 [MessagePackObject(keyAsPropertyName: true)] 달면 멤버에 명시적 주석이 필요하지 않습니다. 이러한 경우 특정 공용 멤버를 무시하려면 특성을 사용합니다 [IgnoreMember] .

  • 프라이빗 멤버를 직렬화하려면 StandardResolverAllowPrivate를 사용합니다.

  • System.Runtime.Serialization 주석은 MessagePack 주석 대신 사용할 수 있습니다: [DataContract] 대신 [MessagePackObject], [DataMember] 대신 [Key], 및 [IgnoreDataMember] 대신 [IgnoreMember] 사용할 수 있습니다. 이러한 주석은 직렬화 가능한 형식을 정의하는 라이브러리의 MessagePack에 대한 종속성을 방지하려는 경우에 유용할 수 있습니다.

  • 읽기 전용/변경할 수 없는 형식 및 멤버를 지원합니다. serializer는 가장 일치하는 인수 목록과 함께 공용 생성자를 사용하려고 합니다. 특성을 사용하여 [SerializationConstructor] 생성자를 명시적 방식으로 지정할 수 있습니다.

  • Serialization 임의 형식은 작성하기 간단한 사용자 지정 포맷터를 통해 지원됩니다. 이렇게 하면 특성 및 특정 생성자 또는 멤버 패턴에 대한 모든 요구 사항이 제거됩니다.

  • serializer는 .NET 기본 클래스 라이브러리에서 제공하는 가장 자주 사용되는 기본 제공 형식 및 컬렉션을 지원합니다. 공식 문서에서 전체 목록을 찾을 수 있습니다. 사용자 지정을 허용하는 확장 지점 이 있습니다.

Warning

MessagePack에는 형식 제한 없이 데이터를 역직렬화할 수 있는 API가 있습니다. 각 MessagePack 보안 정보 별로 이러한 API는 피해야 합니다.

Warning

일부 MessagePack API에는 변경 가능한 통계를 통해 사용자 지정할 수 있는 동작이 있습니다. 즉, 동일한 프로세스, AssemblyLoadContext 또는 AppDomain의 다른 코드에 따라 코드가 성공하거나 실패할 수 있습니다. 이 MessagePackAnalyzer 패키지를 참조하고 변경 가능한 동작으로 API의 모든 사용을 호출하는 MsgPack001 및 MsgPack002 분석기를 사용하도록 설정하여 코드를 복원력을 유지할 수 있습니다.