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.
- JSON s využitím System.Text.Json
- 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:
- MessagePack using MessagePack for C#
- 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)
Upozorňující
Nezaměňujte DataContractSerializer s NetDataContractSerializer. NetDataContractSerializer je identifikován jako nebezpečný serializátor.
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.