Wybieranie serializatora
Brak zamiany typu drop-in dla BinaryFormatterprogramu , ale istnieje kilka serializatorów zalecanych do serializacji typów platformy .NET. Niezależnie od wybranego serializatora zmiany będą potrzebne do integracji z nowym serializatorem. Podczas tych migracji należy wziąć pod uwagę kompromisy między zmuszaniem nowego serializatora do obsługi istniejących typów z jak najmniejszą liczbą zmian w porównaniu z typami refaktoryzacji w celu włączenia idiomatycznego serialization z wybranym serializatorem. Po wybraniu serializatora należy zbadać jego dokumentację w celu uzyskania najlepszych rozwiązań.
Jeśli format binarny serialization nie jest wymagany, możesz rozważyć użycie formatów JSON lub XML serialization . Te serializatory są dołączone do platformy .NET i są oficjalnie obsługiwane.
- Kod JSON przy użyciu pliku System.Text.Json
- Xml przy użyciu polecenia
System.Runtime.Serialization.DataContractSerializer
Jeśli kompaktowa reprezentacja binarna jest ważna dla Twoich scenariuszy, zalecane są następujące serialization formaty i serializatory typu open source:
- MessagePack przy użyciu pakietu MessagePack dla języka C#
- protokołu korzystające z narzędzia protobuf-net
To, czy masz kontrolę nad zmianą kształtu interfejsu API typu serializowanego, będzie miało wpływ na kierunek i podejście do serializationmetody . Migracja do tych serializatorów może być prostsza z możliwością dodawania adnotacji do typów z nowymi atrybutami, dodawania nowych konstruktorów, tworzenia typów/elementów członkowskich jako publicznych i zmieniania pól na właściwości. Bez tej możliwości korzystanie z nowoczesnych serializatorów może wymagać implementacji niestandardowych konwerterów lub rozpoznawania nazw.
Funkcja | BinaryFormatter | System.Text.Json | DataContractSerializer | MessagePack dla języka C# | protobuf-net |
---|---|---|---|---|---|
Serialization format | binary (NRBF) | JSON | XML | binary (MessagePack) | binary (protokołu) |
Kompaktowa reprezentacja | ✔️ | ❌ | ❌ | ✔️ | ✔️ |
Czytelny dla człowieka | ❌️ | ✔️ | ✔️ | ❌️ | ❌️ |
Wydajność | ❌️ | ✔️ | ❌ | ✔️ | ✔️ |
[Serializable] obsługa atrybutów |
✔️ | ❌ | ✔️ | ❌ | ❌ |
Serializowanie typów publicznych | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
Serializowanie typów innych niż publiczne | ✔️ | ✔️ | ✔️ | ✔️ (wymagany jest program rozpoznawania nazw) | ✔️ |
Serializowanie pól | ✔️ | ✔️ (zrezygnuj) | ✔️ | ✔️ (wymagany atrybut) | ✔️ (wymagany atrybut) |
Serializowanie pól innych niż publiczne | ✔️ | ✔️ (wymagany jest program rozpoznawania nazw) | ✔️ | ✔️ (wymagany jest program rozpoznawania nazw) | ✔️ (wymagany atrybut) |
Serializowanie właściwości | ✔️* | ✔️ | ✔️ | ✔️ (wymagany atrybut) | ✔️ (wymagany atrybut) |
Deserializowanie elementów członkowskich tylko do odczytu | ✔️ | ✔️ (wymagany atrybut) | ✔️ | ✔️ | ✔️ (wymagany jest bez parametrów ctor) |
Hierarchia typów polimorficznych | ✔️ | ✔️ (wymagany atrybut) | ✔️ | ✔️ (wymagany atrybut) | ✔️ (wymagany atrybut) |
Obsługa AOT | ❌️ | ✔️ | ❌ | ✔️ | ❌ (planowane) |
Kod JSON przy użyciu pliku System.Text.Json
Biblioteka System.Text.Json
jest nowoczesnym serializatorem, który podkreśla bezpieczeństwo, wysoką wydajność i niską alokację pamięci dla formatu JavaScript Object Notation (JSON). Kod JSON jest czytelny dla człowieka i ma szeroką obsługę międzyplatformową. Chociaż format oparty na tekście nie jest tak kompaktowy, jak formaty binarne, można go znacznie zmniejszyć poprzez kompresję.
Serialization wyklucza niepublicznie i niepublicznie elementy członkowskie, chyba że są obsługiwane specjalnie za pomocą atrybutów i konstruktorów. Plik System.Text.Json obsługuje również niestandardowe serialization i deserializacji w celu uzyskania większej kontroli nad sposobem konwertowania typów na format JSON i odwrotnie. Plik System.Text.Json nie obsługuje atrybutu [Serializable]
.
Przeprowadź migrację do pliku System.Text.Json (JSON).
Xml przy użyciu elementu DataContractSerializer
DataContractSerializer wprowadzono w programie .NET Framework 3.0 i służy do serializacji i deserializacji danych wysyłanych w komunikatach programu Windows Communication Foundation (WCF). DataContractSerializer to serializator XML, który w pełni obsługuje serialization model programowania używany przez BinaryFormatter
element , co oznacza, że honoruje [Serializable]
atrybut i implementację ISerializable. W związku z tym jest to serializator, który wymaga najmniejszej ilości wysiłku w celu przeprowadzenia migracji. Wymaga to jednak określenia znanych typów z góry (ale większość kolekcji i typów pierwotnych platformy .NET znajduje się na domyślnej liście dozwolonych i nie trzeba ich określać).
Chociaż DataContractSerializer
niesie ze sobą te korzyści funkcjonalne podczas migracji z BinaryFormatterprogramu , nie jest tak nowoczesna ani wydajna, jak inne opcje.
Migrowanie do elementu DataContractSerializer (XML).
Ostrzeżenie
Nie należy mylić DataContractSerializer z NetDataContractSerializer. NetDataContractSerializer jest identyfikowany jako niebezpieczny serializator.
Plik binarny przy użyciu pakietu MessagePack
MessagePack jest kompaktowym formatem binarnym serialization , 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.
Migrowanie do pakietu MessagePack (binarnego).
Binarne przy użyciu narzędzia protobuf-net
Biblioteka protobuf-net to serializator oparty na kontraktach dla platformy .NET, który używa formatuserialization protokołu binarnego. Interfejs API jest zgodny z typowymi wzorcami platformy .NET i jest zasadniczo porównywalny z XmlSerializer
elementami i DataContractSerializer
. Ta popularna biblioteka jest również bogata w funkcje i może obsługiwać typy i pola inne niż publiczne, ale wiele scenariuszy wymaga zastosowania atrybutów do elementów członkowskich.