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ěhemtěchtochm metodám je důležité při těchto migracích zvážit kompromisy mezi vynucením nového serializátoru, aby se s vybraným serializátorem zpracovával co nejméně změn a refaktoringem serialization . Po výběru serializátoru by se měla jeho dokumentace studovat pro osvědčené postupy.

serialization Pokud binární formát není požadavkem, můžete zvážit použití formátů JSON nebo XMLserialization. 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í serialization formáty a opensourcové serializátory:

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

Zda máte kontrolu nad změnou tvaru rozhraní API serializovaného typu ovlivní váš směr a přístup k serialization. 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í serialization a deserializaci pro větší kontrolu nad tím, jak se typy převedou na JSON a naopak. 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 serialization programovací model, který byl používán BinaryFormatter, což znamená, že dodržuje [Serializable] atribut 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í 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í.

Migrace na MessagePack (binární)

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

Knihovna protobuf-net je serializátor založený na kontraktech pro .NET, který používá binární formát vyrovnávací pamětiserialization protokolu. 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í)