Migrera till protobuf-net (binärt)
protobuf-net--biblioteket är en kontraktsbaserad serialiserare för .NET som använder det binära Protocol Buffers serialiseringsformat. API:et följer typiska .NET-mönster och är i stort sett jämförbart med XmlSerializer
och DataContractSerializer
.
Vissa beteenden och funktioner i protobuf-net kommer att vara anmärkningsvärda under migreringar från BinaryFormatter, och många scenarier kräver att attribut tillämpas på medlemmar.
- Som standard kan både offentliga och icke-offentliga typer serialiseras, och serialiseraren förväntar sig en parameterlös konstruktor.
- protobuf-net kräver att varje serialiserbar typ kommenteras med
[ProtoContract]
attributet. Det här attributet kan också angeSkipConstructor = true
egenskapen, vilket tar bort behovet av en viss konstruktor. - Varje serialiserbart icke-statiskt fält och en egenskap måste kommenteras med
[ProtoMember(int identifier)]
attribut. Medlemsnamnen är inte kodade i data. I stället måste användarna välja ett positivt heltal för att identifiera varje medlem som måste vara unik inom den typen. -
Arv måste uttryckligen deklareras via
[ProtoInclude(...)]
attribut för varje typ med kända undertyper. - Skrivskyddade fält stöds som standard.
- Alternativt kan vissa icke-tillskrivna tupppelliknande typer identifieras med konstruktormönster. En typ med en konstruktor som har parametrar som matchar (efter namn) tolkas alla deklarerade offentliga medlemmar som en tuppl och parameterordningen används för att härleda identifieraren för den medlemmen.
- Vi rekommenderar starkt att du använder
protobuf-net.BuildTools
designtidspaketet. Detta ger kompileringstidsvarningar om vanliga fel.
Stegvis migrering
- Hitta alla användningar av
BinaryFormatter
. - Se till att serialiseringsvägarna för kod omfattas av tester, så att du kan verifiera dina ändringar och undvika att introducera buggar.
- Installera
protobuf-net
paketet (och eventuelltprotobuf-net.BuildTools
). - Hitta alla typer som serialiseras med
BinaryFormatter
. - För typer som du kan ändra:
- Kommentera med
[ProtoContract]
attribut alla typer som är markerade med[Serializable]
eller implementeraISerializable
gränssnittet. Om dessa typer inte exponeras för andra appar (till exempel: du skriver ett bibliotek) som kan använda olika serialiserare somDataContractSerializer
, kan du ta bort anteckningarna[Serializable]
ochISerializable
. - För härledda typer gäller
[ProtoInclude(...)]
för deras bastyper (se exemplet nedan). - För varje typ som deklarerar en konstruktor som accepterar parametrar lägger du till en parameterlös konstruktor eller anger
SkipConstructor = true
för[ProtoContract]
attributet. Lämna en kommentar som förklarar protobuf-net-kravet (så ingen tar bort det av misstag). - Markera alla medlemmar (fält och egenskaper) som du vill serialisera med
[ProtoMember(int identifier)]
. Alla identifierare måste vara unika inom en enda typ, men samma tal kan återanvändas i undertyper om arv är aktiverat.
- Kommentera med
- För typer som du inte kan ändra:
- För typer som tillhandahålls av själva .NET kan du använda
ProtoBuf.Meta.RuntimeTypeModel.Default.CanSerialize(Type type)
API:et för att kontrollera om de stöds internt av protobuf-net. - Du kan skapa dedikerade dataöverföringsobjekt (DTO) och mappa dem i enlighet med detta (du kan använda implicit cast-operator för det).
- Använd API:et
RuntimeTypeModel
för att definiera allt som attributen tillåter.
- För typer som tillhandahålls av själva .NET kan du använda
- Ersätt användningen av
BinaryFormatter
medProtoBuf.Serializer
.
-[Serializable]
+[ProtoContract]
+[ProtoInclude(2, typeof(Point2D))]
public class Point1D
{
+ [ProtoMember(1)]
public int X { get; set; }
}
-[Serializable]
+[ProtoContract]
public class Point2D : Point1D
{
+ [ProtoMember(2)]
public int Y { get; set; }
}
Samarbeta med oss på GitHub
Källan för det här innehållet finns på GitHub, där du även kan skapa och granska ärenden och pull-begäranden. Se vår deltagarguide för mer information.