Välj en serialiserare
Det finns ingen drop-in ersättning för BinaryFormatter, men det finns flera serialiserare som rekommenderas för serialisering av .NET-typer. Oavsett vilken serialiserare du väljer behövs ändringar för integrering med den nya serialiseraren. Under dessa migreringar är det viktigt att överväga kompromisserna mellan att tvinga den nya serialiseraren att hantera befintliga typer med så få ändringar som möjligt jämfört med refaktoriseringstyper för att aktivera idiomatisk serialization med den valda serialiseraren. När en serialiserare har valts bör dokumentationen studeras för bästa praxis.
Om ett binärt serialization format inte är ett krav kan du överväga att använda JSON- eller XML-format serialization . Dessa serialiserare ingår i .NET och stöds officiellt.
- JSON med System.Text.Json
- XML med hjälp av
System.Runtime.Serialization.DataContractSerializer
Om en kompakt binär representation är viktig för dina scenarier rekommenderas följande serialization format och serialiserare med öppen källkod:
- MessagePack med MessagePack för C#
- Protokollbuffertar med protobuf-net
Om du har kontroll över att ändra API-formen för den serialiserade typen påverkar din riktning och metod för serialization. Migrering till dessa serialiserare kan vara enklare med möjligheten att kommentera typer med nya attribut, lägga till nya konstruktorer, göra typer/medlemmar offentliga och ändra fält till egenskaper. Utan den möjligheten kan användning av moderna serialiserare kräva implementering av anpassade konverterare eller matchare.
Funktion | BinaryFormatter | System.Text.Json | DataContractSerializer | MessagePack för C# | protobuf-net |
---|---|---|---|---|---|
Serialization format | binärt (NRBF) | JSON | XML | binärt (MessagePack) | binärt (protokollbuffertar) |
Kompakt representation | ✔️ | ❌ | ❌ | ✔️ | ✔️ |
Läsbar för människor | ❌️ | ✔️ | ✔️ | ❌️ | ❌️ |
Prestanda | ❌️ | ✔️ | ❌ | ✔️ | ✔️ |
[Serializable] attributstöd |
✔️ | ❌ | ✔️ | ❌ | ❌ |
Serialisera offentliga typer | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
Serialisera icke-offentliga typer | ✔️ | ✔️ | ✔️ | ✔️ (lösen krävs) | ✔️ |
Serialiseringsfält | ✔️ | ✔️ (anmäl dig) | ✔️ | ✔️ (attribut krävs) | ✔️ (attribut krävs) |
Serialisera icke-offentliga fält | ✔️ | ✔️ (lösen krävs) | ✔️ | ✔️ (lösen krävs) | ✔️ (attribut krävs) |
Serialiseringsegenskaper | ✔️* | ✔️ | ✔️ | ✔️ (attribut krävs) | ✔️ (attribut krävs) |
Deserialisera readonly-medlemmar | ✔️ | ✔️ (attribut krävs) | ✔️ | ✔️ | ✔️ (parameterlös ctor krävs) |
Polymorfisk typhierarki | ✔️ | ✔️ (attribut krävs) | ✔️ | ✔️ (attribut krävs) | ✔️ (attribut krävs) |
AOT-stöd | ❌️ | ✔️ | ❌ | ✔️ | ❌ (planerat) |
JSON med System.Text.Json
Biblioteket System.Text.Json
är en modern serialiserare som betonar säkerhet, höga prestanda och låg minnesallokering för JSON-formatet (JavaScript Object Notation). JSON är läsbart för människor och har brett plattformsoberoende stöd. Även om textbaserat format inte är lika kompakt som binära format, kan det minskas avsevärt i storlek genom komprimering.
Serialization exkluderar icke-offentliga och skrivskyddade medlemmar om de inte hanteras specifikt via attribut och konstruktorer. System.Text.Json stöder även anpassad serialization och deserialisering för mer kontroll över hur typer konverteras till JSON och vice versa. System.Text.Json stöder inte attributet [Serializable]
.
Migrera till System.Text.Json (JSON).
XML med DataContractSerializer
DataContractSerializer introducerades i .NET Framework 3.0 och används för att serialisera och deserialisera data som skickas i WCF-meddelanden (Windows Communication Foundation). DataContractSerializerär en XML-serialiserare som helt stöder serialization programmeringsmodellen som användes av BinaryFormatter
, vilket innebär att den [Serializable]
respekterar attributet och implementeringen av ISerializable. Därför är det serialiseraren som kräver minst arbete att migrera till. Det kräver dock att de kända typerna anges i förväg (men de flesta .NET-samlingar och primitiva typer finns i en standardlista med tillåtna och behöver inte anges).
Även om DataContractSerializer
medför dessa funktionella fördelar när du migrerar från BinaryFormatter, är det inte lika modernt eller högpresterande som de andra valen.
Migrera till DataContractSerializer (XML).
Varning
Förväxla DataContractSerializer inte med NetDataContractSerializer. NetDataContractSerializer identifieras som en farlig serialiserare.
Binär med MessagePack
MessagePack är ett kompakt binärt serialization format, vilket resulterar i mindre meddelandestorlekar jämfört med JSON och XML. Biblioteket öppen källkod MessagePack for C# är mycket högpresterande och erbjuder inbyggd supersnabb LZ4-komprimering för en ännu mindre datastorlek. Det fungerar bäst när datatyper kommenteras med antingen DataContractSerializer
eller bibliotekets egna attribut. Den kan konfigureras för att stödja AOT-miljöer, icke-offentliga typer och medlemmar samt skrivskyddade typer och medlemmar.
Migrera till MessagePack (binärt).
Binärt med protobuf-net
Protobuf-net-biblioteket är en kontraktsbaserad serialiserare för .NET som använder formatet binära protokollbuffertarserialization. API:et följer typiska .NET-mönster och är i stort sett jämförbart med XmlSerializer
och DataContractSerializer
. Det här populära biblioteket är också funktionsrikt och kan hantera icke-offentliga typer och fält, men många scenarier kräver att attribut tillämpas på medlemmar.