Freigeben über


DesignerSerializationManager Klasse

Definition

Stellt eine Implementierung der IDesignerSerializationManager Schnittstelle bereit.

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
Vererbung
DesignerSerializationManager
Implementiert

Hinweise

Die IDesignerSerializationManager Schnittstelle ist als formatunabhängige Schnittstelle für ein Objekt konzipiert, das die Serialisierung steuert. Es stellt im Wesentlichen Kontext und Dienste für Serialisierer bereit, die tatsächlich die Deserialisierung ausführen. IDesignerSerializationManager unterstützt den Deserialisierungsprozess, indem Objekte nachverfolgt werden. Dies ähnelt der Technik der IDesignerHost Benutzeroberfläche: Designer stellen tatsächlich die Benutzeroberfläche (UI) bereit und IDesignerHost stellen den Klebstoff bereit, der es verschiedenen Designern ermöglicht, zusammenzuarbeiten.

Die DesignerSerializationManager Klasse implementiert IDesignerSerializationManager. Es wurde entwickelt, um eine generische Form der Deserialisierung bereitzustellen, die den Laufzeit serialisierern wie der BinaryFormatter.

Die DesignerSerializationManager Klasse erreicht drei Ziele:

  • Es handelt sich um ein einfaches, turnkey-Objekt, das zum Deserialisieren einer Vielzahl von Formaten verwendet werden kann.

  • Es ist generisch und nicht an ein bestimmtes Format gebunden. Sie kann auch für die CodeDOM-Deserialisierung sowie für die Markup-Deserialisierung verwendet werden.

  • Es ist erweiterbar und unterstützt verschiedene Serialisierungsmethoden, die in Kopier-/Einfüge- und Rückgängig-/Wiederholen-Szenarien verwendet werden.

Die Entwurfszeit-Serialisierung unterscheidet sich von der Serialisierung des Laufzeitobjekts:

  • Das Objekt, das die Serialisierung ausführt, ist in der Regel vom Laufzeitobjekt getrennt, sodass Entwurfszeitlogik aus einer Komponente entfernt werden kann.

  • Das Serialisierungsschema setzt voraus, dass das Objekt vollständig initialisiert und dann durch Eigenschaften- und Methodenaufrufe während der Deserialisierung geändert wird.

  • Eigenschaften eines Objekts mit Werten, die nie für das Objekt festgelegt wurden (die Eigenschaften enthalten die Standardwerte), werden nicht serialisiert. Umgekehrt kann der Deserialisierungsstrom Löcher aufweisen.

  • Der Schwerpunkt liegt auf der Qualität des Inhalts innerhalb des Serialisierungsstreams und nicht auf der vollständigen Serialisierung eines Objekts. Dies bedeutet, dass, wenn es keine definierte Methode zum Serialisieren eines Objekts gibt, dieses Objekt möglicherweise übersprungen wird, anstatt eine Ausnahme auszuwerfen. Das Serialisierungsmodul kann hier Heuristiken bereitstellen, um zu entscheiden, welche Fehler ignoriert werden können und welche nicht wiederhergestellt werden können.

  • Der Serialisierungsstream enthält möglicherweise mehr Daten als für die Deserialisierung erforderlich ist. Die Serialisierung des Quellcodes enthält z. B. einen Gemischten Benutzercode mit dem Code, der zum Deserialisieren eines Objektdiagramms erforderlich ist. Dieser Benutzercode muss bei der Deserialisierung ignoriert und bei der Serialisierung beibehalten werden.

Aufgrund dieser Unterschiede gilt ein anderes Serialisierungsmodell für die Entwurfszeit-Serialisierung. Dieses Modell verwendet ein separates Serialisierungsobjekt für jeden Datentyp, der serialisiert wird. Jeder Serialisierer leistet seinen kleinen Beitrag zum Problem insgesamt. Diese Serialisierer werden alle über einen gemeinsamen Serialisierungs-Manager koordiniert. Der Serialisierungs-Manager ist für die Aufrechterhaltung des Zustands zwischen diesen verschiedenen Serialisierern verantwortlich. Betrachten Sie beispielsweise die folgende Klasse:

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

Eine Instanz dieser Klasse würde drei verschiedene Serialisierer verwenden: eine für SampleObject, eine für Zeichenfolgen und eine für ganze Zahlen. The serializer for SampleObject is called the root serializer because SampleObject is the root of the serialization graph. Komplexere Objektdiagramme können ebenfalls erstellt werden. Überlegen Sie beispielsweise, was passiert, wenn SampleObject sie wie folgt geändert würden:

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

Dadurch kann SampleObject ein untergeordnetes Element vorhanden sein, das eine andere Instanz von sich selbst ist. Der folgende Code füllt das Objektdiagramm aus:

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

Wenn root serialisiert wird, werden vier Serialisierer verwendet: ein Stamm-Serialisierer, ein Serialisierer für das untergeordnete Element SampleObject, ein Serialisierer für intund ein Serialisierer für string. Serialisierer werden basierend auf dem Typ zwischengespeichert, daher ist es nicht erforderlich, für jede Instanz von SampleObject.

Die DesignerSerializationManager Klasse basiert auf der Idee einer Serialisierungssitzung. Eine Sitzung verwaltet den Zustand, auf den von den verschiedenen Serialisierern zugegriffen werden kann. Wenn eine Sitzung verworfen wird, wird dieser Zustand zerstört. Dadurch können Sie sicherstellen, dass Serialisierer weitgehend zustandslos bleiben und Serialisierer bereinigen können, die beschädigt wurden. In den folgenden Tabellen wird beschrieben, wie der Zustand in und zwischen Sitzungen verwaltet wird.

Globaler Status

Dieser Zustand gehört dem Serialisierungs-Manager-Objekt, ist jedoch unabhängig von der aktuellen Serialisierungssitzung.

Objekt Verwendung
Serialisierungsanbieter Objekte können sich selbst als benutzerdefinierte Serialisierungsanbieter hinzufügen. Da diese Anbieter verwendet werden, um Serialisierer zu finden, erleben sie eine Serialisierungssitzung.

Session-Owned Staat

Dieser Zustand gehört einer Sitzung und wird zerstört, wenn eine Sitzung zerstört wird. Folglich löst der Zugriff auf eigenschaften oder Methoden, die diesen Zustand bearbeiten würden, eine Ausnahme aus, wenn sich der Serialisierungs-Manager nicht in einer aktiven Sitzung befindet.

Objekt Verwendung
ResolveName-Ereignis Das ResolveName Ereignis wird von einem Serialisierer angefügt, um zusätzliche Auflösungen von Namen bereitzustellen. Alle Handler werden von diesem Ereignis getrennt, wenn eine Sitzung beendet wird.
SerializationComplete-Ereignis Das SerializationComplete Ereignis wird direkt vor dem Löschen einer Sitzung ausgelöst. Anschließend werden alle Handler von diesem Ereignis getrennt.
Name-Tabelle Der Serialisierungs-Manager verwaltet eine Tabelle, die zwischen Objekten und ihren Namen zuordnet. Serialisierer können Objekten Namen zur einfachen Identifizierung geben. Diese Namenstabelle wird gelöscht, wenn die Sitzung beendet wird.
Serialisierungscache Der Serialisierungs-Manager verwaltet einen Cache von Serialisierern, die zur Bereitstellung aufgefordert wurden. Dieser Cache wird gelöscht, wenn die Sitzung beendet wird. Die öffentliche GetSerializer Methode kann jederzeit sicher aufgerufen werden, der Wert wird jedoch nur zwischengespeichert, wenn sie innerhalb einer Sitzung aufgerufen wird.
Kontextstapel Der Serialisierungs-Manager verwaltet ein Objekt, das als Kontextstapel bezeichnet wird, auf das Sie mit der Context Eigenschaft zugreifen können. Serialisierer können diesen Stapel verwenden, um zusätzliche Informationen zu speichern, die für andere Serialisierer verfügbar sind. Beispielsweise kann ein Serialisierer, der einen Eigenschaftswert serialisiert, den Eigenschaftennamen im Serialisierungsstapel pushen, bevor der Wert serialisiert werden soll. Dieser Stapel wird gelöscht, wenn die Sitzung beendet wird.
Fehlerliste Der Serialisierungs-Manager verwaltet eine Liste der Fehler, die während der Serialisierung aufgetreten sind. Diese Liste, auf die über die Errors Eigenschaft zugegriffen wird, wird gelöscht, wenn die Sitzung beendet wird. Der Zugriff auf die Errors Eigenschaft zwischen Sitzungen führt zu einer Ausnahme.

Konstruktoren

Name Beschreibung
DesignerSerializationManager()

Initialisiert eine neue Instanz der DesignerSerializationManager-Klasse.

DesignerSerializationManager(IServiceProvider)

Initialisiert eine neue Instanz der DesignerSerializationManager Klasse mit dem angegebenen Dienstanbieter.

Eigenschaften

Name Beschreibung
Container

Ruft den Container für diesen Serialisierungs-Manager ab oder legt diesen fest.

Errors

Ruft die Liste der Fehler ab, die während der Serialisierung oder Deserialisierung aufgetreten sind.

PreserveNames

Dient zum Abrufen oder Festlegen eines Werts, der angibt, ob die CreateInstance(Type, ICollection, String, Boolean) Methode auf das Vorhandensein des angegebenen Namens im Container überprüfen soll.

PropertyProvider

Ruft das Objekt ab, das zum Bereitstellen von Eigenschaften für die Eigenschaft des Serialisierungs-Managers Properties verwendet werden soll.

RecycleInstances

Dient zum Abrufen oder Festlegen eines Werts, der angibt, ob CreateInstance(Type, ICollection, String, Boolean) immer eine neue Instanz eines Typs erstellt wird.

ValidateRecycledTypes

Dient zum Abrufen oder Festlegen eines Werts, der angibt, ob die CreateInstance(Type, ICollection, String, Boolean) Methode überprüft, ob übereinstimmende Namen auf denselben Typ verweisen.

Methoden

Name Beschreibung
CreateInstance(Type, ICollection, String, Boolean)

Erstellt eine Instanz eines Typs.

CreateSession()

Erstellt eine neue Serialisierungssitzung.

Equals(Object)

Bestimmt, ob das angegebene Objekt dem aktuellen Objekt entspricht.

(Geerbt von Object)
GetHashCode()

Dient als Standardhashfunktion.

(Geerbt von Object)
GetRuntimeType(String)

Ruft den Typ ab, der dem angegebenen Typnamen entspricht.

GetSerializer(Type, Type)

Ruft den Serialisierer für den angegebenen Objekttyp ab.

GetService(Type)

Ruft den angeforderten Dienst ab.

GetType()

Ruft die Type der aktuellen Instanz ab.

(Geerbt von Object)
GetType(String)

Ruft den angeforderten Typ ab.

MemberwiseClone()

Erstellt eine flache Kopie der aktuellen Object.

(Geerbt von Object)
OnResolveName(ResolveNameEventArgs)

Löst das ResolveName-Ereignis aus.

OnSessionCreated(EventArgs)

Löst das SessionCreated-Ereignis aus.

OnSessionDisposed(EventArgs)

Löst das SessionDisposed-Ereignis aus.

ToString()

Gibt eine Zeichenfolge zurück, die das aktuelle Objekt darstellt.

(Geerbt von Object)

Ereignisse

Name Beschreibung
SessionCreated

Tritt auf, wenn eine Sitzung erstellt wird.

SessionDisposed

Tritt auf, wenn eine Sitzung verworfen wird.

Explizite Schnittstellenimplementierungen

Name Beschreibung
IDesignerSerializationManager.AddSerializationProvider(IDesignerSerializationProvider)

Fügt dem Serialisierungs-Manager einen benutzerdefinierten Serialisierungsanbieter hinzu.

IDesignerSerializationManager.Context

Ruft den Kontextstapel für diese Serialisierungssitzung ab.

IDesignerSerializationManager.CreateInstance(Type, ICollection, String, Boolean)

Implementiert die CreateInstance(Type, ICollection, String, Boolean) Methode.

IDesignerSerializationManager.GetInstance(String)

Ruft eine Instanz eines erstellten Objekts des angegebenen Namens ab.

IDesignerSerializationManager.GetName(Object)

Ruft einen Namen für das angegebene Objekt ab.

IDesignerSerializationManager.GetSerializer(Type, Type)

Ruft einen Serialisierer des angeforderten Typs für den angegebenen Objekttyp ab.

IDesignerSerializationManager.GetType(String)

Ruft einen Typ des angegebenen Namens ab.

IDesignerSerializationManager.Properties

Implementiert die Properties Eigenschaft.

IDesignerSerializationManager.RemoveSerializationProvider(IDesignerSerializationProvider)

Entfernt einen zuvor hinzugefügten Serialisierungsanbieter.

IDesignerSerializationManager.ReportError(Object)

Wird verwendet, um einen wiederherstellbaren Fehler in der Serialisierung zu melden.

IDesignerSerializationManager.ResolveName

Tritt auf, wenn IDesignerSerializationManager.GetName(Object) der angegebene Name in der Namenstabelle des Serialisierungs-Managers nicht gefunden werden kann.

IDesignerSerializationManager.SerializationComplete

Tritt auf, wenn die Serialisierung abgeschlossen ist.

IDesignerSerializationManager.SetName(Object, String)

Legt den Namen für das angegebene Objekt fest.

IServiceProvider.GetService(Type)

Eine Beschreibung dieses Elements finden Sie in der GetService(Type) Methode.

Gilt für:

Weitere Informationen