Sdílet prostřednictvím


Migrace na MessagePack (binární)

MessagePack je kompaktní binární serialization formát, což vede k menším velikostem zpráv ve srovnání s JSON a XML. Open source MessagePack pro knihovnu C# je vysoce výkonný a nabízí integrovanou super-rychlou kompresi LZ4 pro ještě menší velikost dat. Nejlépe funguje, když jsou datové typy opatřené poznámkami buď s vlastními atributy knihovny, nebo s vlastními DataContractSerializer atributy knihovny. Dá se nakonfigurovat tak, aby podporovala prostředí AOT, neveřejné typy a členy a typy a členy jen pro čtení.

Některá chování a funkce MessagePacku pro jazyk C# budou během migrací BinaryFormatterz , zejména pokud změny rozhraní API serializovaných typů nelze provést nebo je nutné minimalizovat.

  • Ve výchozím nastavení lze serializovat pouze veřejné typy. Privátní a interní struktury a třídy lze serializovat pouze v případech, kdy StandardResolverAllowPrivate.Options je k dispozici jako argument MessagePackSerializer.Serialize a MessagePackSerializer.Deserialize metody.

  • MessagePack vyžaduje, aby každý serializovatelný typ byl anotován atributem [MessagePackObject] . Je možné se tomu vyhnout pomocí ContractlessStandardResolver, ale může to způsobit problémy s správou verzí v budoucnu.

  • Každé serializovatelné nestatické pole a vlastnost musí být opatřena poznámkami atributu [Key] . Pokud typ označíte pomocí atributu [MessagePackObject(keyAsPropertyName: true)] , členové nevyžadují explicitní poznámky. Pokud chcete v takovém případě ignorovat určité veřejné členy, použijte [IgnoreMember] atribut.

  • K serializaci privátních členů použijte StandardResolverAllowPrivate.

  • System.Runtime.Serialization Poznámky lze použít místo poznámek MessagePack: [DataContract] místo [MessagePackObject], [DataMember] místo [Key], a [IgnoreDataMember] místo [IgnoreMember]. Tyto poznámky můžou být užitečné, pokud se chcete vyhnout závislosti na MessagePacku v knihovně, která definuje serializovatelné typy.

  • Podporuje jen čtení a neměnné typy a členy. Serializátor se pokusí použít veřejný konstruktor se seznamem nejlepších shodných argumentů. Konstruktor lze explicitně zadat pomocí [SerializationConstructor] atributu.

  • Serialization libovolných typů jsou podporovány prostřednictvím vlastních formátovacích souborů, které jsou pro vytváření jednoduché. Tím se odeberou všechny požadavky na atributy a konkrétní konstruktor nebo vzory členů.

  • Serializátor podporuje nejčastěji používané předdefinované typy a kolekce poskytované knihovnami základních tříd .NET. Úplný seznam najdete v oficiální dokumentaci. Obsahuje body rozšíření, které umožňují přizpůsobení.

Upozorňující

MessagePack obsahuje rozhraní API, která umožňují deserializaci dat bez omezení typu. V poznámkách k zabezpečení balíčku MessagePack byste se těmto rozhraním API měli vyhnout.

Upozorňující

Některá rozhraní API MessagePacku mají chování, které je přizpůsobitelné prostřednictvím proměnlivých statických objektů, což znamená, že váš kód může být úspěšný nebo neúspěšný na základě toho, jaký jiný kód ve stejném procesu může provést AssemblyLoadContext nebo AppDomain. Svůj kód můžete zachovat odolný také odkazem na balíček MessagePackAnalyzer a povolením analyzátorů MsgPack001 a MsgPack002, které označují použití rozhraní API s možností změny.