Delen via


Migreren naar MessagePack (binair)

MessagePack een compacte binaire serialisatie-indeling is, wat resulteert in kleinere berichtgrootten in vergelijking met JSON en XML. De open source MessagePack voor C# -bibliotheek is zeer goed presterend en biedt ingebouwde super snelle LZ4-compressie voor een nog kleinere gegevensgrootte. Het werkt het beste wanneer gegevenstypen worden geannoteerd met DataContractSerializer of de eigen kenmerken van de bibliotheek. Het kan worden geconfigureerd om AOT-omgevingen, niet-openbare typen en leden en alleen-lezentypen en leden te ondersteunen.

Sommige gedragingen en functies van MessagePack voor C# zijn opmerkelijk tijdens migraties van BinaryFormatter, met name als wijzigingen in de API's van de geserialiseerde typen niet kunnen worden aangebracht of moeten worden geminimaliseerd.

  • Standaard zijn alleen openbare typen serialiseerbaar. Privé- en interne structs en klassen kunnen alleen worden geserialiseerd wanneer StandardResolverAllowPrivate.Options ze worden opgegeven als argument voor MessagePackSerializer.Serialize en MessagePackSerializer.Deserialize methoden.

  • MessagePack vereist dat elk serialiseerbare type wordt geannoteerd met het [MessagePackObject] kenmerk. Het is mogelijk om te voorkomen dat het gebruik van ContractlessStandardResolver, maar in de toekomst mogelijk problemen met versiebeheer veroorzaakt.

  • Elk serialiseerbaar niet-statisch veld en een eigenschap moeten worden geannoteerd met het [Key] kenmerk. Als u aantekeningen maakt op het type met het [MessagePackObject(keyAsPropertyName: true)] kenmerk, hoeven leden geen expliciete aantekeningen te maken. Gebruik in dat geval het [IgnoreMember] kenmerk om bepaalde openbare leden te negeren.

  • Als u persoonlijke leden wilt serialiseren, gebruikt u StandardResolverAllowPrivate.

  • System.Runtime.Serializationaantekeningen kunnen worden gebruikt in plaats van MessagePack-aantekeningen: [DataContract] in plaats van , [MessagePackObject] in plaats van [DataMember][Key], en [IgnoreDataMember] in plaats van [IgnoreMember]. Deze aantekeningen kunnen handig zijn als u een afhankelijkheid van MessagePack in de bibliotheek wilt voorkomen die serialiseerbare typen definieert.

  • Het ondersteunt leesbare/onveranderbare typen en leden. De serializer probeert de openbare constructor te gebruiken met de best overeenkomende argumentenlijst. De constructor kan op een expliciete manier worden opgegeven met behulp van het [SerializationConstructor] kenmerk.

  • Serialization van willekeurige typen worden ondersteund via aangepaste formatters die eenvoudig kunnen worden geschreven. Hiermee verwijdert u alle vereisten voor kenmerken en specifieke constructor- of lidpatronen.

  • De serializer ondersteunt de meest gebruikte ingebouwde typen en verzamelingen die worden geleverd door de .NET-basisklassebibliotheken. U vindt de volledige lijst in officiële documenten. Het bevat uitbreidingspunten die aanpassing mogelijk maken.

Waarschuwing

MessagePack heeft API's waarmee gegevens zonder typebeperkingen kunnen worden gedeserialiseerd. Per MessagePack-beveiligingsnotities moeten deze API's worden vermeden.

Waarschuwing

Sommige MessagePack-API's hebben gedrag dat kan worden aangepast via onveranderbare statische functies, wat betekent dat uw code kan slagen of mislukken op basis van wat andere code in hetzelfde proces, AssemblyLoadContext of AppDomain kan doen. U kunt uw code tolerant houden door ook te verwijzen naar het MessagePackAnalyzer-pakket en de MsgPack001- en MsgPack002-analyses in te schakelen, die elk gebruik van API's met veranderlijk gedrag aanroepen.