DesignerSerializationManager Třída
Definice
Důležité
Některé informace platí pro předběžně vydaný produkt, který se může zásadně změnit, než ho výrobce nebo autor vydá. Microsoft neposkytuje žádné záruky, výslovné ani předpokládané, týkající se zde uváděných informací.
Poskytuje implementaci IDesignerSerializationManager rozhraní.
public ref class DesignerSerializationManager : IServiceProvider, System::ComponentModel::Design::Serialization::IDesignerSerializationManager
public class DesignerSerializationManager : IServiceProvider, System.ComponentModel.Design.Serialization.IDesignerSerializationManager
type DesignerSerializationManager = class
interface IDesignerSerializationManager
interface IServiceProvider
Public Class DesignerSerializationManager
Implements IDesignerSerializationManager, IServiceProvider
- Dědičnost
-
DesignerSerializationManager
- Implementuje
Poznámky
Rozhraní IDesignerSerializationManager je navrženo tak, aby bylo rozhraní nezávislé na formátu objektu, který řídí serializaci. V podstatě poskytuje kontext a služby serializátorům, které ve skutečnosti provádějí deserializaci. IDesignerSerializationManager pomáhá v procesu deserializace tím, že sleduje objekty. To se podobá technice IDesignerHost rozhraní: návrháři ve skutečnosti poskytují uživatelské rozhraní a IDesignerHost poskytují lepidlo, které umožňuje spolupráci různých návrhářů.
Třída DesignerSerializationManager implementuje IDesignerSerializationManager. Je navržen tak, aby poskytoval obecnou formu deserializace, která se podobá serializátorům za běhu, jako BinaryFormatterje .
Třída DesignerSerializationManager dosahuje tří cílů:
Jedná se o jednoduchý objekt na klíč, který lze použít k deserializaci různých formátů.
Je obecný a není vázán na žádný konkrétní formát. Dá se použít stejně pro deserializaci CodeDOM i pro deserializaci značek.
Je rozšiřitelný a podporuje různé metody serializace, které se používají ve scénářích kopírování, vkládání a vrácení zpět nebo znovu.
Serializace v době návrhu má následující rozdíly od serializace objektů za běhu:
Objekt provádějící serializaci je obecně oddělen od objektu za běhu, takže logika návrhu může být odebrána z komponenty.
Schéma serializace předpokládá, že objekt bude vytvořen plně inicializován a poté upraven prostřednictvím vlastností a metod vyvolání během deserializace.
Vlastnosti objektu, které mají hodnoty, které nebyly nikdy nastaveny pro objekt (vlastnosti obsahují výchozí hodnoty), nejsou serializovány. Naopak, tok deserializace může mít díry.
Důraz je kladen na kvalitu obsahu v rámci serializačního streamu, spíše než na úplnou serializaci objektu. To znamená, že pokud neexistuje žádný definovaný způsob serializace objektu, může být tento objekt vynechán místo vyvolání výjimky. Modul serializace může poskytnout heuristiky zde rozhodnout, které chyby mohou být ignorovány a které jsou neobnovitelné.
Stream serializace může obsahovat více dat, než je potřeba pro deserializaci. Například serializace zdrojového kódu obsahuje smíšený uživatelský kód s kódem potřebným k deserializaci grafu objektů. Tento uživatelský kód musí být ignorován při deserializaci a při serializaci zachován.
Vzhledem k těmto rozdílům se jiný model serializace vztahuje na serializaci v době návrhu. Tento model využívá samostatný objekt serializátoru pro každý datový typ serializovaný. Každý serializátor poskytuje svůj malý příspěvek k problému jako celku. Všechny tyto serializátory jsou koordinovány prostřednictvím běžného správce serializace. Správce serializace je zodpovědný za udržování stavu mezi těmito různými serializátory. Představte si například následující třídu:
public class SampleObject
{
private string stringValue = null;
private int intValue = int.MinValue;
public string StringProperty
{
get { return this.stringValue; }
set { this.stringValue = value; }
}
public int IntProperty
{
get { return this.intValue; }
set{ this.intValue = value; }
}
}
Public Class SampleObject
Private stringValue As String = Nothing
Private intValue As Integer = Integer.MinValue
Public Property StringProperty() As String
Get
Return Me.stringValue
End Get
Set
Me.stringValue = value
End Set
End Property
Public Property IntProperty() As Integer
Get
Return Me.intValue
End Get
Set
Me.intValue = value
End Set
End Property
End Class
Instance této třídy by používala tři různé serializátory: jeden pro SampleObject
, jeden pro řetězce a druhý pro celá čísla. Serializátor pro SampleObject
se nazývá kořenový serializátor, protože SampleObject
je kořenem grafu serializace. Je možné vytvořit i složitější grafy objektů. Zvažte například, co by se stalo, kdyby SampleObject
se změnily takto:
public class SampleObject
{
private string stringValue = null;
private int intValue = int.MinValue;
private SampleObject childValue = null;
public string StringProperty
{
get { return this.stringValue; }
set { this.stringValue = value; }
}
public int IntProperty
{
get { return this.intValue; }
set { this.intValue = value; }
}
public SampleObject Child
{
get { return this.childValue; }
set { this.childValue = value; }
}
}
Public Class SampleObject
Private stringValue As String = Nothing
Private intValue As Integer = Integer.MinValue
Private childValue As SampleObject = Nothing
Public Property StringProperty() As String
Get
Return Me.stringValue
End Get
Set
Me.stringValue = value
End Set
End Property
Public Property IntProperty() As Integer
Get
Return Me.intValue
End Get
Set
Me.intValue = value
End Set
End Property
Public Property Child() As SampleObject
Get
Return Me.childValue
End Get
Set
Me.childValue = value
End Set
End Property
End Class
To umožňuje SampleObject
mít podřízenou instanci, která je sama o sobě další instancí. Graf objektů vyplní následující kód:
class Program
{
static void Main(string[] args)
{
SampleObject root = new SampleObject();
SampleObject currentObject = root;
for (int i = 0; i < 10; i++)
{
SampleObject o = new SampleObject();
currentObject.Child = o;
currentObject = o;
}
}
}
Class Program
Public Overloads Shared Sub Main()
Main(System.Environment.GetCommandLineArgs())
End Sub
Overloads Shared Sub Main(args() As String)
Dim root As New SampleObject()
Dim currentObject As SampleObject = root
Dim i As Integer
For i = 0 To 9
Dim o As New SampleObject()
currentObject.Child = o
currentObject = o
Next i
End Sub
End Class
Při root
serializaci se použijí čtyři serializátory: jeden kořenový serializátor, jeden serializátor pro podřízený SampleObject
, jeden serializátor pro int
a jeden serializátor pro string
. Serializátory jsou uloženy v mezipaměti na základě typu, takže není nutné vytvářet serializátor pro každou instanci .SampleObject
Třída DesignerSerializationManager je založena na myšlence serializace relace. Relace udržuje stav, ke kterému mohou přistupovat různé serializátory. Při vyřazení relace je tento stav zničen. To pomáhá zajistit, aby serializátory zůstaly do značné míry bezstavové, a pomáhá vyčistit serializátory, které jsou poškozeny. Následující tabulky popisují, jak se spravuje stav v relacích a mezi relacemi.
Globální stav
Tento stav vlastní objekt serializace správce, ale je nezávislý na aktuální relaci serializace.
Objekt | Využití |
---|---|
Zprostředkovatelé serializace | Objekty se můžou přidávat jako vlastní zprostředkovatele serializace. Vzhledem k tomu, že se tito zprostředkovatelé používají k vyhledání serializátorů, přežijí relaci serializace. |
Session-Owned State
Tento stav vlastní relace a je zničen při zničení relace. V důsledku toho přístup k jakékoli vlastnosti nebo metody, které by manipulovaly s tímto stavem vyvolá výjimku, pokud serializace správce není v aktivní relaci.
Objekt | Využití |
---|---|
ResolveName Událost | Událost ResolveName je připojena serializátorem, který poskytuje další překlad názvů. Všechny obslužné rutiny jsou od této události odpojeny, když se relace ukončí. |
SerializationComplete Událost | Událost SerializationComplete je vyvolána těsně před odstraněním relace. Potom se všechny obslužné rutiny od této události oddělí. |
Tabulka názvů | Správce serializace udržuje tabulku, která mapuje mezi objekty a jejich názvy. Serializátory mohou dát názvy objektů pro snadnou identifikaci. Tato tabulka názvů se po ukončení relace vymaže. |
Mezipaměť serializátoru | Správce serializace udržuje mezipaměť serializátorů, které byly vyzvány k dodání. Po ukončení relace se tato mezipaměť vymaže. Veřejnou GetSerializer metodu lze kdykoli bezpečně volat, ale její hodnota je uložena v mezipaměti pouze v případě, že je volána z relace. |
Kontextový zásobník | Správce serializace udržuje objekt s názvem kontextový zásobník, ke kterému můžete přistupovat pomocí Context vlastnosti . Serializátory mohou použít tento zásobník k ukládání dalších informací, které jsou k dispozici pro jiné serializátory. Například serializátor, který serializuje hodnotu vlastnosti, může nasdílí název vlastnosti v zásobníku serializace před dotazem na hodnotu serializovat. Tento zásobník se vymaže po ukončení relace. |
Seznam chyb | Správce serializace udržuje seznam chyb, ke kterým došlo během serializace. Tento seznam, ke kterému se přistupuje prostřednictvím Errors vlastnosti , se při ukončení relace vymaže. Přístup k Errors vlastnosti mezi relacemi způsobí výjimku. |
Konstruktory
DesignerSerializationManager() |
Inicializuje novou instanci DesignerSerializationManager třídy. |
DesignerSerializationManager(IServiceProvider) |
Inicializuje novou instanci DesignerSerializationManager třídy s daným poskytovatelem služby. |
Vlastnosti
Container |
Získá nebo nastaví kontejner pro tento serializace správce. |
Errors |
Získá seznam chyb, ke kterým došlo během serializace nebo deserializace. |
PreserveNames |
Získá nebo nastaví hodnotu určující, zda CreateInstance(Type, ICollection, String, Boolean) by metoda měla zkontrolovat přítomnost daného názvu v kontejneru. |
PropertyProvider |
Získá objekt, který by měl být použit k poskytnutí vlastností serializace správce Properties vlastnosti. |
RecycleInstances |
Získá nebo nastaví hodnotu, která označuje, zda CreateInstance(Type, ICollection, String, Boolean) bude vždy vytvořit novou instanci typu. |
ValidateRecycledTypes |
Získá nebo nastaví hodnotu, která označuje, zda CreateInstance(Type, ICollection, String, Boolean) metoda ověří, že odpovídající názvy odkazují na stejný typ. |
Metody
CreateInstance(Type, ICollection, String, Boolean) |
Vytvoří instanci typu. |
CreateSession() |
Vytvoří novou relaci serializace. |
Equals(Object) |
Určí, zda se zadaný objekt rovná aktuálnímu objektu. (Zděděno od Object) |
GetHashCode() |
Slouží jako výchozí hashovací funkce. (Zděděno od Object) |
GetRuntimeType(String) |
Získá typ odpovídající zadanému názvu typu. |
GetSerializer(Type, Type) |
Získá serializátor pro daný typ objektu. |
GetService(Type) |
Získá požadovanou službu. |
GetType() |
Získá aktuální Type instanci. (Zděděno od Object) |
GetType(String) |
Získá požadovaný typ. |
MemberwiseClone() |
Vytvoří mělkou kopii aktuálního Objectsouboru . (Zděděno od Object) |
OnResolveName(ResolveNameEventArgs) |
ResolveName Vyvolá událost. |
OnSessionCreated(EventArgs) |
SessionCreated Vyvolá událost. |
OnSessionDisposed(EventArgs) |
SessionDisposed Vyvolá událost. |
ToString() |
Vrátí řetězec, který představuje aktuální objekt. (Zděděno od Object) |
Událost
SessionCreated |
Nastane při vytvoření relace. |
SessionDisposed |
Nastane při vyřazení relace. |