Udostępnij za pośrednictwem


Migrowanie do pakietu MessagePack (binarnego)

MessagePack jest kompaktowym formatem serializacji binarnej, co powoduje mniejsze rozmiary komunikatów w porównaniu z formatami JSON i XML. Biblioteka MessagePack typu open source dla języka C# jest wysoce wydajna i oferuje wbudowaną bardzo szybką kompresję LZ4 dla jeszcze mniejszego rozmiaru danych. Sprawdza się najlepiej, gdy typy danych są oznaczone własnymi atrybutami DataContractSerializer lub biblioteki. Można go skonfigurować do obsługi środowisk AOT, typów innych niż publiczne i elementów członkowskich oraz typów i członków tylko do odczytu.

Niektóre zachowania i funkcje pakietu MessagePack dla języka C# będą godne uwagi podczas migracji z BinaryFormatterprogramu , zwłaszcza jeśli nie można wprowadzić zmian w interfejsach API serializacji typów lub należy je zminimalizować.

  • Domyślnie tylko typy publiczne są serializowalne. Prywatne i wewnętrzne struktury i klasy mogą być serializowane tylko wtedy, gdy StandardResolverAllowPrivate.Options jest podawany jako argument metody MessagePackSerializer.Serialize i MessagePackSerializer.Deserialize .

  • Pakiet MessagePack wymaga dodawania adnotacji do każdego typu z możliwością serializacji za pomocą atrybutu [MessagePackObject] . Można tego uniknąć przy użyciu elementu ContractlessStandardResolver, ale może to spowodować problemy z przechowywaniem wersji w przyszłości.

  • Każde pole niestatyczne z możliwością serializacji i właściwość musi być oznaczona adnotacją z atrybutem [Key] . W przypadku dodawania adnotacji do typu za pomocą atrybutu [MessagePackObject(keyAsPropertyName: true)] elementy członkowskie nie wymagają jawnych adnotacji. W takim przypadku, aby zignorować niektóre publiczne elementy członkowskie, użyj atrybutu [IgnoreMember] .

  • Aby serializować prywatne elementy członkowskie, użyj elementu StandardResolverAllowPrivate.

  • System.Runtime.Serialization Adnotacje mogą być używane zamiast adnotacji MessagePack: [DataContract][MessagePackObject]zamiast , [DataMember] a nie [Key], i [IgnoreDataMember] zamiast [IgnoreMember]. Te adnotacje mogą być przydatne, jeśli chcesz uniknąć zależności od elementu MessagePack w bibliotece definiującej typy możliwe do serializacji.

  • Obsługuje on niezmienialne/niezmienialne typy i elementy członkowskie. Serializator spróbuje użyć publicznego konstruktora z najlepszą dopasowaną listą argumentów. Konstruktor można określić w sposób jawny przy użyciu [SerializationConstructor] atrybutu.

  • Serialization dowolne typy są obsługiwane za pośrednictwem niestandardowych formatów, które są proste do utworzenia. Spowoduje to usunięcie wszystkich wymagań dotyczących atrybutów i określonych wzorców konstruktora lub składowych.

  • Serializator obsługuje najczęściej używane wbudowane typy i kolekcje udostępniane przez biblioteki klas bazowych platformy .NET. Pełną listę można znaleźć w oficjalnych dokumentach. Zawiera on punkty rozszerzenia, które umożliwiają dostosowywanie.

Ostrzeżenie

Pakiet MessagePack ma interfejsy API umożliwiające deserializacji danych bez ograniczeń typu. Należy unikać tych interfejsów API zgodnie z informacjami o zabezpieczeniach pakietu MessagePack.

Ostrzeżenie

Niektóre interfejsy API pakietu MessagePack mają zachowanie, które można dostosowywać za pośrednictwem modyfikowalnych statycznych danych, co oznacza, że kod może zakończyć się powodzeniem lub niepowodzeniem w oparciu o inny kod w tym samym procesie, może to zrobić AssemblyLoadContext lub AppDomain. Możesz zachować odporność kodu, odwołując się również do pakietu MessagePackAnalyzer i włączając analizatory MsgPack001 i MsgPack002, które umożliwiają wywoływanie dowolnych zastosowań interfejsów API z zachowaniem z możliwością zmiany.