Migrace na protobuf-net (binární)
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
.
Některé chování a funkce protobuf-net nebudou během migrace BinaryFormatterz a mnoho scénářů vyžaduje použití atributů na členy.
- Ve výchozím nastavení jsou veřejné i neveřejné typy serializovatelné, přičemž serializátor očekává konstruktor bez parametrů.
- Protobuf-net vyžaduje, aby každý serializovatelný typ byl opatřen poznámkami s atributem
[ProtoContract]
. Tento atribut může volitelně zadatSkipConstructor = true
vlastnost, která eliminuje potřebu libovolného konkrétního konstruktoru. - Každé serializovatelné nestatické pole a vlastnost musí být opatřena poznámkami s atributem
[ProtoMember(int identifier)]
. Názvy členů nejsou v datech zakódovány. Místo toho musí uživatelé vybrat kladné celé číslo, aby identifikovali každého člena, který musí být v daném typu jedinečný. - Dědičnost musí být explicitně deklarována prostřednictvím
[ProtoInclude(...)]
atributu u každého typu se známými podtypy. - Pole jen pro čtení jsou ve výchozím nastavení podporovaná.
- Alternativně se některé typy podobné řazené kolekci členů rozpoznají konstruktorem. Typ s konstruktorem, který má parametry odpovídající (podle názvu), budou všechny deklarované veřejné členy interpretovány jako řazená kolekce členů a pořadí parametrů se použije k odvození identifikátoru daného člena.
- Použití balíčku v době návrhu
protobuf-net.BuildTools
se důrazně doporučuje. To nabízí upozornění na čas kompilace běžných chyb.
Podrobná migrace
- Vyhledejte všechna použití
BinaryFormatter
. - Ujistěte se, že serialization jsou cesty kódu pokryté testy, abyste mohli ověřit změny a vyhnout se chybám.
- Nainstalujte
protobuf-net
balíček (a volitelněprotobuf-net.BuildTools
). - Vyhledejte všechny typy, které jsou serializovány pomocí
BinaryFormatter
. - U typů, které můžete upravit:
- Poznámkami s atributem
[ProtoContract]
všechny typy, které jsou označené[Serializable]
nebo implementujíISerializable
rozhraní. Pokud tyto typy nejsou vystavené jiným aplikacím (například: píšete knihovnu), které mohou používat různé serializátory, jakoDataContractSerializer
je , můžete odebrat[Serializable]
aISerializable
poznámky. - U odvozených typů platí
[ProtoInclude(...)]
pro jejich základní typy (viz následující příklad). - Pro každý typ, který deklaruje jakýkoli konstruktor, který přijímá parametry, přidejte konstruktor bez parametrů nebo zadejte
SkipConstructor = true
pro[ProtoContract]
atribut. Napište komentář, který vysvětluje požadavek protobuf-net (takže ho nikdo omylem neodebere). - Označte všechny členy (pole a vlastnosti), se kterými chcete serializovat
[ProtoMember(int identifier)]
. Všechny identifikátory musí být jedinečné v rámci jednoho typu, ale stejná čísla je možné znovu použít v dílčích typech, pokud je povolená dědičnost.
- Poznámkami s atributem
- U typů, které nemůžete upravit:
- U typů poskytovaných samotným rozhraním .NET můžete pomocí
ProtoBuf.Meta.RuntimeTypeModel.Default.CanSerialize(Type type)
rozhraní API zkontrolovat, jestli jsou nativně podporovány technologií protobuf-net. - Můžete vytvořit vyhrazené objekty pro přenos dat (DTO) a namapovat je odpovídajícím způsobem (pro to můžete použít implicitní operátor přetypování).
RuntimeTypeModel
Pomocí rozhraní API definujte vše, co atributy umožňují.
- U typů poskytovaných samotným rozhraním .NET můžete pomocí
- Nahraďte použití parametrem
BinaryFormatter
ProtoBuf.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; }
}
Spolupracujte s námi na GitHubu
Zdroj tohoto obsahu najdete na GitHubu, kde můžete také vytvářet a kontrolovat problémy a žádosti o přijetí změn. Další informace najdete v našem průvodci pro přispěvatele.