Serializace v C# – pár tipů


Těchto pár tipů se týká použití automatické serializace zajištěné pomocí atributu [Serializable].

Neserializování automatických property a událostí

Někdy nějaké vlastnosti, události nebo proměnné nechceme serializovat. Někdy dokonce nemůžeme, protože příslušné datové typy není možné serializovat.

Z toho důvodu se používá atribut [NonSerialized], který říká, že dekorovaná proměnná se nemá do serializace zahrnovat.

“Problém” nastává, když máme automatickou vlastnost (Auto-Implemented Properties), která nemá v kódu žádnou proměnnou uchovávající data. Vlastnosti (mají getter – get { … }) obecně není možné označit atributem [NonSerialized], protože kompilátor vyžaduje, aby byl tento atribut přiřazen pouze proměnné, která uchovává data (field).

Tento “problém” má jednoduché řešení. Stačí použít atribut: [field: NonSerialized], který říká, že se nemají serializovat příslušná data.

Stejný postup (použití [field: NonSerialized]) se používá i v případě, že nechceme serializovat události.

Metody automaticky volané při serializaci a deserializaci

V .NETu je možné si částečně přizpůsobit i proces serializace pomocí atributu [Serializable]. Samozřejmě je možné definovat, co se nemá serializovat, ale to někdy nestačí. Pro přizpůsobení celého procesu slouží několik atributů:

  • [OnSerializing] – metoda označená tímto atributem je volána před samotnou serializací objektu
  • [OnSerialized] – metoda je volána po serializaci
  • [OnDeserializing] – metoda je volána před deserializací
  • [OnDeserialized] – metoda je volána po deserializaci

Pomocí těch atributů je možné nadefinovat chování při serializaci/deserializaci a tak si částečně přizpůsobit chování automatické serializace se zachováním její jednoduchosti (oproti použití rozhraní ISerializable).

Metody, které těmito atributy mohou být označeny musí splňovat dvě podmínky:

  • Návratový typ void
  • Jako parametr přebírat instanci třídy StreamingContext

Příklad takovéto metody (při každé serializaci zvýšíme počet, serializací tohoto objektu):

[OnSerialized]
private void OnSerialized(StreamingContext context)
{
    this.serializationCount++;
}

Tento postup je v současnosti doporučovaným způsobem, jak si přizpůsobit serializační proces.

, ,

Komentáře jsou uzavřeny.