čtvrtek 25. února 2010

Serializace objektů - úvod

Úvod Serializace objektů je v Dynamics AX intenzivně využívaná, ale obvykle je tak dobře skrytá, že si ji mnoho vývojářů příliš neuvědomuje. Pochopení její implementace je ale v některých situacích nezbytné a v opačném případě vznikají zbytečné a často i poněkud záhadné chyby. Podívejme se na tedy serializaci trochu podrobněji. Co to je? Serializace objektu znamená uložení jeho stavu do podoby, kterou je možné uložit nebo někam přenést. Objekt je pak možné obnovit (deserializovat) do původního stavu. Jako příklad použití v Dynamics AX lze uvést:
  • Ukládání uživatelského nastavení (dříve použité hodnoty v dialogových oknech, vlastní nastavení formulářů apod.).
  • Ukládání objektů pro pozdější použití (úlohy spouštěné v určitém čase, uložení dotazu (např. pro Zabezpečení na úrovni záznamů))
  • Klient/server optimalizace (spuštění dialogu serverové třídy na klientu)
Realizace Cílem serializace je převést referenční datové typy (což jsou fakticky odkazy na místo v paměti) na hodnotové. A protože v Dynamics AX patří mezi hodnotové typy i kontejner, je pro účely serializace jasnou volbou. Příklad: Mějme třídu Class1, obsahující instanční proměnné str retezec1 a real cislo1 (ty představují stav objektu). Uložit stav tohoto objektu do kontejneru lze snadno pomocí speciální syntaxe pro vytváření kontejnerů: [retezec1, cislo1]. Takto jsme získali kontejner, obsahující string a real – všechno hodnotové typy. Tento kontejner může být přímo uložen do databáze, předán jako parametr metody mezi klientem a serverem a podobně. Deserializace objektu provedeme tak, že vytvoříme novou instanci Class1 a hodnoty jejích proměnných naplníme z kontejneru. Opět můžeme využít speciální syntaxe a provést přiřazení jako [retezec1, cislo1] = kontejner; Pokud přidáme nebo odebereme proměnnou, musíme změnit serializační i deserializační kód. K tomu, aby to nebylo nutné dělat ručně, se v Dynamics AX používají makra, což je pro řadu vývojářů asi nejobtížnější část problému. Makra jsou (zjednodušeně řečeno) speciální příkazy, které ovlivňují, jak se zdrojový kód zkompiluje. Lze například – v závislosti na hodnotě parametru – zkompilovat aplikaci jednou s ladícími příkazy a podruhé bez nich. V AX jsou uvozeny znakem # a nejčastěji se používají pro definici konstant, ale lze vytvářet i podmíněně kompilovaný kód, makra s parametry atd. Více na MSDN. Pro téma serializace stačí vědět, že kód definovaný pomocí klauzule #define, #localmacro apod. se před kompilací vloží na místo, kde je makro použito. Vytvoříme-li makro #define.CurrentList(retezec1, cislo1), můžeme kontejner s proměnnými vytvořit prostým voláním [#CurrentList] (protože to je pro kompilátor to samé jako [retezec1, cislo1]). Obdobně deserializaci zapíšeme jako [#CurrentList] = kontejner;. Příště se podíváme na verzování serializovaných objektů a některá konkrétní použití serializace v AX.

Žádné komentáře:

Okomentovat