Sdílet prostřednictvím


Volba serializátoru

Neexistuje žádná výměna za BinaryFormatter, ale existuje několik serializátorů doporučeno pro serializaci typů .NET. Bez ohledu na to, který serializátor zvolíte, budou změny potřebné pro integraci s novým serializátorem. Během těchto migrací je důležité vzít v úvahu kompromisy mezi vynucením nového serializátoru, aby zvládl stávající typy s co nejmenšími změnami, a refaktoringem typů pro umožnění idiomatické serializace s vybraným serializátorem. Po výběru serializátoru by se měla jeho dokumentace studovat pro osvědčené postupy.

Pokud binární serializační formát není požadavkem, můžete zvážit použití formátů serializace JSON nebo XML. Tyto serializátory jsou součástí .NET a jsou oficiálně podporovány.

  1. JSON s využitím System.Text.Json
  2. XML pomocí System.Runtime.Serialization.DataContractSerializer

Pokud je pro vaše scénáře důležitá kompaktní binární reprezentace, doporučuje se následující formáty serializace a opensourcové serializátory:

  1. MessagePack using MessagePack for C#
  2. Vyrovnávací paměti protokolu využívající protobuf-net

Jestli máte kontrolu nad změnou tvaru rozhraní API serializovaného typu, ovlivní váš směr a přístup k serializaci. Migrace na tyto serializátory může být jednodušší s možností přidávat poznámky k typům s novými atributy, přidávat nové konstruktory, vytvářet typy/členy veřejné a měnit pole na vlastnosti. Bez této schopnosti může použití moderních serializátorů vyžadovat implementaci vlastních převaděčů nebo překladačů.

Funkce BinaryFormatter System.Text.Json DataContractSerializer MessagePack pro C# protobuf-net
Serialization formát binary (NRBF) JSON XML binary (MessagePack) binární (vyrovnávací paměti protokolu)
Kompaktní reprezentace ✔️ ✔️ ✔️
Čitelný člověk ❌️ ✔️ ✔️ ❌️ ❌️
Výkon ❌️ ✔️ ✔️ ✔️
[Serializable] podpora atributů ✔️ ✔️
Serializace veřejných typů ✔️ ✔️ ✔️ ✔️ ✔️
Serializace neveřejných typů ✔️ ✔️ ✔️ ✔️ (vyžaduje se překladač) ✔️
Serializace polí ✔️ ✔️ (opt in) ✔️ ✔️ (atribut povinný) ✔️ (atribut povinný)
Serializace neveřejných polí ✔️ ✔️ (vyžaduje se překladač) ✔️ ✔️ (vyžaduje se překladač) ✔️ (atribut povinný)
Serializace vlastností ✔️* ✔️ ✔️ ✔️ (atribut povinný) ✔️ (atribut povinný)
Deserializace členů jen pro čtení ✔️ ✔️ (atribut povinný) ✔️ ✔️ ✔️ (vyžaduje se bez parametrů ctor)
Hierarchie polymorfních typů ✔️ ✔️ (atribut povinný) ✔️ ✔️ (atribut povinný) ✔️ (atribut povinný)
Podpora AOT ❌️ ✔️ ✔️ ❌ (plánované)

JSON s využitím System.Text.Json

Knihovna System.Text.Json je moderní serializátor, který zdůrazňuje zabezpečení, vysoký výkon a nízké přidělení paměti pro formát JSON (JavaScript Object Notation). JSON je čitelný pro člověka a má širokou podporu pro různé platformy. I když textový formát není tak kompaktní jako binární formáty, dá se výrazně zmenšit pomocí komprese.

Serialization vyloučí neveřejné a jen pro čtení členy, pokud nejsou speciálně zpracovány prostřednictvím atributů a konstruktorů. System.Text.Json také podporuje vlastní serializaci a deserializaci pro větší kontrolu nad tím, jak se typy převádějí do JSON a zpět. System.Text.Json nepodporuje [Serializable] atribut.

Migrace na System.Text.Json (JSON)

XML pomocí DataContractSerializer

DataContractSerializer byl zaveden v rozhraní .NET Framework 3.0 a slouží k serializaci a deserializaci dat odesílaných ve zprávách WCF (Windows Communication Foundation). DataContractSerializer je serializátor XML, který plně podporuje programovací model pro serializaci, jenž byl používán BinaryFormatter. To znamená, že respektuje atribut [Serializable] a implementaci ISerializable. Proto je serializátor, který vyžaduje nejmenší úsilí k migraci. Vyžaduje však, aby byly předem zadané známé typy (ale většina kolekcí a primitivních typů .NET je ve výchozím seznamu povolených a není nutné je zadávat).

I když DataContractSerializer přináší tyto funkční výhody při migraci z BinaryFormatter, není to tak moderní nebo výkonné jako ostatní volby.

Migrace na DataContractSerializer (XML)

Binární soubor pomocí MessagePacku

MessagePack je kompaktní binární serializační 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í.

Migrace na MessagePack (binární)

Binární soubor s použitím protobuf-net

Knihovna protobuf-net je serializátor založený na kontraktu pro .NET, který používá binární formát serializace Protokolové Buffery . Rozhraní API se řídí typickými vzory .NET a je široce srovnatelné s XmlSerializer a DataContractSerializer. Tato oblíbená knihovna je také bohatá na funkce a dokáže zpracovávat neveřejné typy a pole, ale mnoho scénářů vyžaduje použití atributů na členy.

Migrace na protobuf-net (binární)