Eseguire la migrazione a MessagePack (binario)

MessagePack è un formato di serializzazione binaria compatto, con dimensioni inferiori dei messaggi rispetto a JSON e XML. La libreria Open Source MessagePack per C# offre prestazioni elevate e offre una compressione LZ4 super veloce predefinita per dimensioni di dati ancora più piccole. Funziona meglio quando i tipi di dati vengono annotati con gli DataContractSerializer attributi della libreria o . Può essere configurato per supportare ambienti AOT, tipi e membri non pubblici e tipi e membri di sola lettura.

Alcuni comportamenti e funzionalità di MessagePack per C# saranno rilevanti durante le migrazioni da BinaryFormatter, soprattutto se le modifiche alle API dei tipi serializzati non possono essere apportate o devono essere ridotte a icona.

  • Per impostazione predefinita, solo i tipi pubblici sono serializzabili. Le classi e gli struct privati e interni possono essere serializzati solo quando StandardResolverAllowPrivate.Options viene fornito come argomento a MessagePackSerializer.Serialize e MessagePackSerializer.Deserialize metodi.

  • MessagePack richiede che ogni tipo serializzabile venga annotato con l'attributo [MessagePackObject] . È possibile evitare che usando ContractlessStandardResolver, ma potrebbe causare problemi con il controllo delle versioni in futuro.

  • Ogni campo non statico serializzabile e una proprietà deve essere annotata con l'attributo [Key] . Se si annota il tipo con l'attributo [MessagePackObject(keyAsPropertyName: true)] , i membri non richiedono annotazioni esplicite. In tal caso, per ignorare determinati membri pubblici, usare l'attributo [IgnoreMember] .

  • Per serializzare i membri privati, usare StandardResolverAllowPrivate.

  • System.Runtime.Serialization le annotazioni possono essere usate anziché le annotazioni MessagePack: [DataContract] invece di [MessagePackObject], [DataMember] invece di [Key]e [IgnoreDataMember] invece di [IgnoreMember]. Queste annotazioni possono essere utili se si desidera evitare una dipendenza da MessagePack nella libreria che definisce tipi serializzabili.

  • Supporta tipi e membri readonly/non modificabili. Il serializzatore tenterà di usare il costruttore pubblico con l'elenco di argomenti corrispondente migliore. Il costruttore può essere specificato in modo esplicito usando l'attributo [SerializationConstructor] .

  • Serialization di tipi arbitrari sono supportati tramite formattatori personalizzati semplici da creare. In questo modo vengono rimossi tutti i requisiti per attributi e modelli di costruttore o membri specifici.

  • Il serializzatore supporta i tipi e le raccolte predefiniti più usati di frequente forniti dalle librerie di classi di base .NET. L'elenco completo è disponibile nella documentazione ufficiale. Include punti di estensione che consentono la personalizzazione.

Avviso

MessagePack include API per consentire la deserializzazione dei dati senza restrizioni di tipo. Per MessagePack Security Notes, queste API devono essere evitate.

Avviso

Alcune API MessagePack hanno un comportamento personalizzabile tramite statiche modificabili, il che significa che il codice può avere esito positivo o negativo in base a ciò che altro codice nello stesso processo, AssemblyLoadContext o AppDomain potrebbe eseguire. È possibile mantenere resiliente il codice anche facendo riferimento al pacchetto MessagePackAnalyzer e abilitando gli analizzatori MsgPack001 e MsgPack002, che chiamano qualsiasi uso delle API con un comportamento modificabile.