Delen via


Een serialisatiefunctie kiezen

Er is geen vervanging voor drop-in, BinaryFormattermaar er zijn verschillende serializers die worden aanbevolen voor het serialiseren van .NET-typen. Ongeacht welke serialisatiefunctie u kiest, zijn er wijzigingen nodig voor integratie met de nieuwe serializer. Tijdens deze migraties is het belangrijk om rekening te houden met de afwegingen tussen het dwingen van de nieuwe serialisatiefunctie om bestaande typen met zo weinig mogelijk wijzigingen af te handelen versus het herstructureren van typen om idiomatische serialisatie mogelijk te maken met de gekozen serialisatiefunctie. Zodra een serializer is gekozen, moet de bijbehorende documentatie worden bestudeerd voor aanbevolen procedures.

Als een binaire serialisatie-indeling geen vereiste is, kunt u overwegen om JSON- of XML-serialisatie-indelingen te gebruiken. Deze serializers zijn opgenomen in .NET en worden officieel ondersteund.

  1. JSON met System.Text.Json
  2. XML met System.Runtime.Serialization.DataContractSerializer

Als een compacte binaire weergave belangrijk is voor uw scenario's, worden de volgende serialisatie-indelingen en opensource-serializers aanbevolen:

  1. MessagePack met MessagePack voor C#
  2. Protocolbuffers met protobuf-net

Of u de API-vorm van het geserialiseerde type wilt wijzigen, heeft invloed op uw richting en benadering van serialisatie. Migratie naar deze serializers is mogelijk eenvoudiger met de mogelijkheid om aantekeningen te maken op typen met nieuwe kenmerken, nieuwe constructors toe te voegen, typen/leden openbaar te maken en velden te wijzigen in eigenschappen. Zonder deze mogelijkheid kan het gebruik van moderne serializers de implementatie van aangepaste conversieprogramma's of resolvers vereisen.

Functie BinaryFormatter System.Text.Json DataContractSerializer MessagePack voor C# protobuf-net
Serialization formatteren binair (NRBF) JSON XML binair (MessagePack) binair (protocolbuffers)
Compacte weergave ✔️ ✔️ ✔️
Leesbaar voor mensen ❌️ ✔️ ✔️ ❌️ ❌️
Prestaties ❌️ ✔️ ✔️ ✔️
[Serializable] kenmerkondersteuning ✔️ ✔️
Openbare typen serialiseren ✔️ ✔️ ✔️ ✔️ ✔️
Niet-openbare typen serialiseren ✔️ ✔️ ✔️ ✔️ (resolver vereist) ✔️
Velden serialiseren ✔️ ✔️ (aanmelden) ✔️ ✔️ (kenmerk vereist) ✔️ (kenmerk vereist)
Niet-openbare velden serialiseren ✔️ ✔️ (resolver vereist) ✔️ ✔️ (resolver vereist) ✔️ (kenmerk vereist)
Eigenschappen serialiseren ✔️* ✔️ ✔️ ✔️ (kenmerk vereist) ✔️ (kenmerk vereist)
Alleen-lezen leden deserialiseren ✔️ ✔️ (kenmerk vereist) ✔️ ✔️ ✔️ (parameterloze ctor vereist)
Polymorfische typehiërarchie ✔️ ✔️ (kenmerk vereist) ✔️ ✔️ (kenmerk vereist) ✔️ (kenmerk vereist)
AOT-ondersteuning ❌️ ✔️ ✔️ ❌ (gepland)

JSON met System.Text.Json

De System.Text.Json bibliotheek is een moderne serialisatiefunctie die de nadruk legt op beveiliging, hoge prestaties en onvoldoende geheugentoewijzing voor de JSON-indeling (JavaScript Object Notation). JSON is leesbaar voor mensen en biedt brede platformoverschrijdende ondersteuning. Hoewel de indeling op basis van tekst niet zo compact is als binaire indelingen, kan deze aanzienlijk worden verkleind door compressie.

Serialization sluit niet-openbare en alleen-lezen leden uit, tenzij ze specifiek worden verwerkt via kenmerken en constructors. System.Text.Json ondersteunt ook aangepaste serialisatie en deserialisatie voor meer controle over hoe typen worden geconverteerd naar JSON en vice versa. System.Text.Json biedt geen ondersteuning voor het [Serializable] kenmerk.

Migreren naar System.Text.Json (JSON).

XML met DataContractSerializer

DataContractSerializer is geïntroduceerd in .NET Framework 3.0 en wordt gebruikt voor het serialiseren en deserialiseren van gegevens die worden verzonden in WCF-berichten (Windows Communication Foundation). DataContractSerializer is een XML-serialisatiefunctie die volledig ondersteuning biedt voor het serialisatieprogrammeermodel dat door de BinaryFormatteris gebruikt, wat betekent dat het de [Serializable] kenmerk en implementatie van ISerializablerespecteert. Daarom is het de serialisatiefunctie waarvoor de minste hoeveelheid moeite nodig is om naar te migreren. Het vereist echter wel dat de bekende typen vooraf worden opgegeven (maar de meeste .NET-verzamelingen en primitieve typen staan op een standaard acceptatielijst en hoeven niet te worden opgegeven).

Hoewel DataContractSerializer deze functionele voordelen bij het migreren van waaruit BinaryFormatterwordt gemigreerd, is het niet zo modern of presterend als de andere keuzes.

Migreren naar DataContractSerializer (XML).

Waarschuwing

Verwar DataContractSerializer het niet met NetDataContractSerializer. NetDataContractSerializer wordt geïdentificeerd als een gevaarlijke serialisatiefunctie.

Binair met MessagePack

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.

Migreren naar MessagePack (binair).

Binair met protobuf-net

De protobuf-net--bibliotheek is een op contracten gebaseerde serialisatiefunctie voor .NET die gebruikmaakt van de binaire Protocolbuffers serialisatie-indeling. De API volgt typische .NET-patronen en is breed vergelijkbaar met XmlSerializer en DataContractSerializer. Deze populaire bibliotheek is ook voorzien van functies en kan niet-openbare typen en velden verwerken, maar veel scenario's vereisen wel het toepassen van kenmerken op leden.

Migreren naar protobuf-net (binair).