Dela via


Migrera till MessagePack (binärt)

MessagePack är ett kompakt binärt serialization format, vilket resulterar i mindre meddelandestorlekar jämfört med JSON och XML. Biblioteket öppen källkod MessagePack for C# är mycket högpresterande och erbjuder inbyggd supersnabb LZ4-komprimering för en ännu mindre datastorlek. Det fungerar bäst när datatyper kommenteras med antingen DataContractSerializer eller bibliotekets egna attribut. Den kan konfigureras för att stödja AOT-miljöer, icke-offentliga typer och medlemmar samt skrivskyddade typer och medlemmar.

Vissa beteenden och funktioner i MessagePack för C# kommer att vara anmärkningsvärda under migreringar från BinaryFormatter, särskilt om ändringar i serialiserade typers API:er inte kan göras eller behöver minimeras.

  • Som standard är endast offentliga typer serialiserbara. Privata och interna structs och klasser kan endast serialiseras när StandardResolverAllowPrivate.Options det anges som ett argument till MessagePackSerializer.Serialize och MessagePackSerializer.Deserialize metoder.

  • MessagePack kräver att varje serialiserbar typ kommenteras med attributet [MessagePackObject] . Det är möjligt att undvika detta genom att använda ContractlessStandardResolver, men det kan orsaka problem med versionshantering i framtiden.

  • Varje serialiserbart icke-statiskt fält och en egenskap måste kommenteras med [Key] attributet. Om du kommenterar typen med [MessagePackObject(keyAsPropertyName: true)] attributet behöver medlemmar inte explicita anteckningar. Om du vill ignorera vissa offentliga medlemmar använder du attributet [IgnoreMember] .

  • Om du vill serialisera privata medlemmar använder du StandardResolverAllowPrivate.

  • System.Runtime.Serialization anteckningar kan användas i stället för MessagePack-anteckningar: [DataContract] i stället för [MessagePackObject], [DataMember] i stället för [Key], och [IgnoreDataMember] i stället för [IgnoreMember]. Dessa anteckningar kan vara användbara om du vill undvika ett beroende av MessagePack i biblioteket som definierar serialiserbara typer.

  • Den stöder skrivskyddade/oföränderliga typer och medlemmar. Serialiseraren försöker använda den offentliga konstruktorn med den bäst matchade argumentlistan. Konstruktorn kan anges på ett explicit sätt med hjälp [SerializationConstructor] av attributet .

  • Serialization av godtyckliga typer stöds via anpassade formatters som är enkla att skapa. Detta tar bort alla krav för attribut och specifika konstruktor- eller medlemsmönster.

  • Serialiseraren stöder de vanligaste inbyggda typerna och samlingarna som tillhandahålls av .NET-basklassbiblioteken. Du hittar hela listan i officiella dokument. Den har tilläggspunkter som tillåter anpassning.

Varning

MessagePack har API:er för att tillåta deserialisering av data utan typbegränsningar. Dessa API:er bör undvikas per MessagePack-säkerhetsanteckningar.

Varning

Vissa MessagePack-API:er har ett beteende som kan anpassas via föränderliga statiska objekt, vilket innebär att koden kan lyckas eller misslyckas baserat på vad annan kod i samma process, AssemblyLoadContext eller AppDomain kan göra. Du kan hålla koden elastisk genom att även referera till MessagePackAnalyzer-paketet och aktivera analysverktygen MsgPack001 och MsgPack002, som anropar all användning av API:er med ändringsbart beteende.