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žené 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 sledováním objektů. To je podobné v technice IDesignerHost rozhraní: návrháři skutečně poskytují uživatelské rozhraní (UI) a IDesignerHost poskytují lepidlo, které umožňuje různým návrhářům spolupracovat.
Třída DesignerSerializationManager implementuje IDesignerSerializationManager. Je navržena tak, aby poskytovala obecnou formu deserializace, která je podobná serializátorům za běhu, jako je .BinaryFormatter
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í svázaný s žádným konkrétním formátem. Lze ji použít stejně pro deserializaci CodeDOM i revizní deserializaci.
Je rozšiřitelný a podporuje různé metody serializace, které se používají ve scénářích kopírování/vložení a vrácení zpět/znovu.
Serializace v době návrhu má následující rozdíly od serializace objektu 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 plně inicializován a poté upraven prostřednictvím vlastnosti a metody vyvolání během deserializace.
Vlastnosti objektu, který obsahuje hodnoty, které nebyly nikdy nastaveny na objekt (vlastnosti obsahují výchozí hodnoty), nejsou serializovány. Naopak deserializační proud může mít díry.
Důraz je kladen na kvalitu obsahu v rámci serializačního streamu, nikoli na úplné serializace 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 zde může poskytnout heuristiku, aby se rozhodl, která selhání lze ignorovat a které jsou nerepravitelné.
Stream serializace může mít více dat, než je potřeba pro deserializaci. Serializace zdrojového kódu má například uživatelský kód smíšený s kódem potřebným k deserializaci grafu objektu. Tento uživatelský kód musí být ignorován při deserializaci a zachován při serializaci.
Vzhledem k těmto rozdílům platí jiný model serializace pro serializaci v době návrhu. Tento model využívá samostatný objekt serializátoru pro každý datový typ, který je serializován. Každý serializátor poskytuje svůj malý příspěvek k problému jako celku. Tyto serializátory jsou všechny koordinované prostřednictvím společného správce serializace. Správce serializace zodpovídá za udržování stavu mezi těmito různými serializátory. Jako příklad zvažte 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 využila tři různé serializátory: jeden pro , jeden pro SampleObjectř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. Složitější grafy objektů je možné vytvořit také. Představte si například, co by se stalo, kdyby SampleObject se změnilo 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 dítě, které je další instancí sebe sama. Následující kód vyplní graf objektů:
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 budou použity čtyři serializátory: jeden kořenový serializátor, jeden serializátor pro podřízený SampleObject, jeden serializátor pro , 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é vytvořit serializátor pro každou instanci SampleObject.
Třída DesignerSerializationManager je založena na myšlence relace serializace. Relace udržuje stav, ke kterému mají přístup různí serializátory. Když je relace uvolněna, tento stav je 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é byly poškozeny. Následující tabulky popisují, jak se stav spravuje v relacích a mezi relacemi.
Globální stav
Tento stav vlastní objekt správce serializace, ale je nezávislý na aktuální serializace relace.
| Objekt | Využití |
|---|---|
| Zprostředkovatelé serializace | Objekty se můžou přidat jako vlastní zprostředkovatelé serializace. Vzhledem k tomu, že se tito zprostředkovatelé používají k vyhledání serializátorů, prožívají 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ýmkoli vlastnostem nebo metodám, které by manipulovat s tímto stavem, vyvolá výjimku, pokud správce serializace není v aktivní relaci.
| Objekt | Využití |
|---|---|
| událost ResolveName | Událost ResolveName je připojena serializátorem, který poskytuje další rozlišení názvů. Při ukončení relace se od této události odpojily všechny obslužné rutiny. |
| událost SerializationComplete | Událost SerializationComplete se vyvolá těsně před odstraněním relace. Potom se všechny obslužné rutiny od této události odpojily. |
| Tabulka názvů | Správce serializace udržuje tabulku, která mapuje mezi objekty a jejich názvy. Serializátory mohou dát názvům objektů pro snadnou identifikaci. Tato tabulka názvů se vymaže při ukončení relace. |
| Mezipaměť serializátoru | Správce serializace udržuje mezipaměť serializátorů, které bylo požádáno o dodání. Tato mezipaměť se vymaže při ukončení relace. 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 označovaný jako 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ílit název vlastnosti do zásobníku serializace před dotazem na hodnotu serializovat. Při ukončení relace se tento zásobník vymaže. |
| 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
| Name | Description |
|---|---|
| DesignerSerializationManager() |
Inicializuje novou instanci DesignerSerializationManager třídy. |
| DesignerSerializationManager(IServiceProvider) |
Inicializuje novou instanci DesignerSerializationManager třídy s daným poskytovatelem služeb. |
Vlastnosti
| Name | Description |
|---|---|
| Container |
Získá nebo nastaví do kontejneru pro tohoto správce serializace. |
| 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) metoda má 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á určuje, zda CreateInstance(Type, ICollection, String, Boolean) bude vždy vytvořit novou instanci typu. |
| ValidateRecycledTypes |
Získá nebo nastaví hodnotu, která určuje, zda CreateInstance(Type, ICollection, String, Boolean) metoda ověří, že odpovídající názvy odkazují na stejný typ. |
Metody
| Name | Description |
|---|---|
| CreateInstance(Type, ICollection, String, Boolean) |
Vytvoří instanci typu. |
| CreateSession() |
Vytvoří novou relaci serializace. |
| Equals(Object) |
Určuje, zda je zadaný objekt roven aktuálnímu objektu. (Zděděno od Object) |
| GetHashCode() |
Slouží jako výchozí funkce hash. (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á Type aktuální instance. (Zděděno od Object) |
| GetType(String) |
Získá požadovaný typ. |
| MemberwiseClone() |
Vytvoří mělkou kopii aktuálního Object. (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
| Name | Description |
|---|---|
| SessionCreated |
Nastane při vytvoření relace. |
| SessionDisposed |
Nastane, když je relace uvolněna. |