Sdílet prostřednictvím


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ě zadat SkipConstructor = 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

  1. Vyhledejte všechna použití BinaryFormatter.
  2. Ujistěte se, že serialization jsou cesty kódu pokryté testy, abyste mohli ověřit změny a vyhnout se chybám.
  3. Nainstalujte protobuf-net balíček (a volitelně protobuf-net.BuildTools).
  4. Vyhledejte všechny typy, které jsou serializovány pomocí BinaryFormatter.
  5. 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, jako DataContractSerializerje , můžete odebrat [Serializable] a ISerializable 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.
  6. 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í.
  7. 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; }
}