Teilen ü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 zu einem Objekt konzipiert, das die Serialisierung steuert. Es stellt im Wesentlichen Kontext und Dienste für Serialisierer bereit, die die Deserialisierung tatsächlich ausführen. IDesignerSerializationManager unterstützt den Deserialisierungsprozess, indem objekte nachverfolgt werden. Dies ähnelt in 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 Laufzeitserialisierungen wie den BinaryFormatterähnelt.

Die DesignerSerializationManager Klasse erreicht drei Ziele:

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

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

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

Die Entwurfszeitserialisierung unterscheidet sich von der Serialisierung von Laufzeitobjekten:

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

  • Das Serialisierungsschema setzt voraus, dass das Objekt vollständig initialisiert und dann während der Deserialisierung durch Aufrufe von Eigenschaften und Methoden 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 Serialisierungsdatenstroms und nicht auf der vollständigen Serialisierung eines Objekts. Dies bedeutet, dass, wenn es keine definierte Möglichkeit zum Serialisieren eines Objekts gibt, dieses Objekt möglicherweise übersprungen wird, anstatt eine Ausnahme auszulösen. Die Serialisierungs-Engine kann hier Heuristiken bereitstellen, um zu entscheiden, welche Fehler ignoriert werden können und welche nicht behebbar sind.

  • Der Serialisierungsdatenstrom enthält möglicherweise mehr Daten, als für die Deserialisierung benötigt wird. Bei der Quellcodeserialisierung wird beispielsweise Der Benutzercode mit dem Code gemischt, der zum Deserialisieren eines Objektgraphen benötigt wird. Dieser Benutzercode muss bei der Deserialisierung ignoriert und bei der Serialisierung beibehalten werden.

Aufgrund dieser Unterschiede gilt ein anderes Serialisierungsmodell für die Entwurfszeitserialisierung. Dieses Modell verwendet ein separates Serialisierungsobjekt für jeden Datentyp, der serialisiert wird. Jedes Serialisierungsprogramm leistet seinen kleinen Beitrag zum Problem als Ganzes. Diese Serialisierer werden alle über einen gemeinsamen Serialisierungs-Manager koordiniert. Der Serialisierungs-Manager ist für die Verwaltung 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

Ein instance dieser Klasse würde drei verschiedene Serialisierer verwenden: eine für SampleObject, eine für Zeichenfolgen und eine andere für ganze Zahlen. Das Serialisierungsprogramm für SampleObject wird als Stammserialisierungsprogramm bezeichnet, da SampleObject der Stamm des Serialisierungsdiagramms ist. Es können auch komplexere Objektgraphen erstellt werden. Überlegen Sie beispielsweise, was passieren würde, wenn SampleObject sie wie folgt geändert würde:

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

Dies ermöglicht SampleObject es, ein Kind zu haben, das ein weiteres instance 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 Stammserialisierungsprogramm, ein Serialisierungsprogramm für das untergeordnete SampleObjectElement, ein Serialisierungsprogramm für intund ein Serialisierungsprogramm für string. Serialisierungsprogramme werden basierend auf dem Typ zwischengespeichert, sodass es nicht erforderlich ist, ein Serialisierungsprogramm für jede instance von SampleObjectzu erstellen.

Die DesignerSerializationManager -Klasse basiert auf der Idee einer Serialisierungssitzung. Eine Sitzung verwaltet den Zustand, auf den die verschiedenen Serialisierer zugreifen können. Wenn eine Sitzung verworfen wird, wird dieser Zustand zerstört. Dies trägt dazu bei, sicherzustellen, dass Serialisierer weitgehend zustandslos bleiben, und hilft, beschädigte Serialisierer zu sauber. 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 Verbrauch
Serialisierungsanbieter Objekte können sich selbst als benutzerdefinierte Serialisierungsanbieter hinzufügen. Da diese Anbieter verwendet werden, um Serialisierer zu finden, überdauern sie eine Serialisierungssitzung.

Session-Owned Zustand

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 Verbrauch
ResolveName -Ereignis Das ResolveName Ereignis wird von einem Serialisierer angefügt, um eine zusätzliche Auflösung von Namen bereitzustellen. Alle Handler werden von diesem Ereignis getrennt, wenn eine Sitzung beendet wird.
SerializationComplete -Ereignis Das SerializationComplete Ereignis wird unmittelbar vor der Löschung einer Sitzung ausgelöst. Anschließend werden alle Handler von diesem Ereignis getrennt.
Namenstabelle Der Serialisierungs-Manager verwaltet eine Tabelle, die zwischen Objekten und ihren Namen zugeordnet ist. Serialisierer können Objektnamen zur einfachen Identifizierung geben. Diese Namenstabelle wird gelöscht, wenn die Sitzung beendet wird.
Serialisierungscache Der Serialisierungs-Manager verwaltet einen Cache mit Serialisierungsprogrammen, zu deren Bereitstellung er aufgefordert wurde. Dieser Cache wird gelöscht, wenn die Sitzung beendet wird. Die öffentliche GetSerializer Methode kann jederzeit sicher aufgerufen werden, aber ihr Wert wird nur zwischengespeichert, wenn sie innerhalb einer Sitzung aufgerufen wird.
Kontextstapel Der Serialisierungs-Manager verwaltet ein Objekt namens Kontextstapel, 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 auf den 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 von Fehlern, 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

DesignerSerializationManager()

Initialisiert eine neue Instanz der DesignerSerializationManager-Klasse.

DesignerSerializationManager(IServiceProvider)

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

Eigenschaften

Container

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

Errors

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

PreserveNames

Ruft einen Wert ab, der angibt, ob das Vorhandensein eines angegebenen Namens im Container durch die CreateInstance(Type, ICollection, String, Boolean)-Methode überprüft werden soll, oder legt diesen fest.

PropertyProvider

Ruft das Objekt ab, mit dem Eigenschaften für die Properties-Eigenschaft des Serialisierungs-Managers bereitgestellt werden sollen.

RecycleInstances

Ruft einen Wert ab, der angibt, ob CreateInstance(Type, ICollection, String, Boolean) immer eine neue Instanz eines Typs erstellt, oder legt diesen fest.

ValidateRecycledTypes

Ruft einen Wert ab, der angibt, ob die CreateInstance(Type, ICollection, String, Boolean)-Methode übereinstimmende Namen hinsichtlich ihres Verweises auf den gleichen Typ überprüft, oder legt diesen fest.

Methoden

CreateInstance(Type, ICollection, String, Boolean)

Erstellt eine Instanz eines Typs.

CreateSession()

Erstellt eine neue Serialisierungssitzung.

Equals(Object)

Bestimmt, ob das angegebene Objekt gleich dem aktuellen Objekt ist.

(Geerbt von Object)
GetHashCode()

Fungiert als Standardhashfunktion.

(Geerbt von Object)
GetRuntimeType(String)

Ruft den entsprechenden Typ für den angegebenen Typnamen ab.

GetSerializer(Type, Type)

Ruft das Serialisierungsprogramm für den angegebenen Objekttyp ab.

GetService(Type)

Ruft den angeforderten Dienst ab.

GetType()

Ruft den Type der aktuellen Instanz ab.

(Geerbt von Object)
GetType(String)

Ruft den angeforderten Typ ab.

MemberwiseClone()

Erstellt eine flache Kopie des 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

SessionCreated

Tritt beim Erstellen einer Sitzung ein.

SessionDisposed

Tritt beim Löschen einer Sitzung ein.

Explizite Schnittstellenimplementierungen

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 mit dem angegebenen Namen ab.

IDesignerSerializationManager.GetName(Object)

Ruft einen Namen für das angegebene Objekt ab.

IDesignerSerializationManager.GetSerializer(Type, Type)

Ruft ein Serialisierungsprogramm vom angeforderten Typ für den angegebenen Objekttyp ab.

IDesignerSerializationManager.GetType(String)

Ruft einen Typ mit dem angegebenen Namen ab.

IDesignerSerializationManager.Properties

Implementiert die Properties-Eigenschaft.

IDesignerSerializationManager.RemoveSerializationProvider(IDesignerSerializationProvider)

Entfernt einen zuvor hinzugefügten Serialisierungsanbieter.

IDesignerSerializationManager.ReportError(Object)

Wird verwendet, um einen behebbaren Fehler bei der Serialisierung zu melden.

IDesignerSerializationManager.ResolveName

Tritt ein, wenn IDesignerSerializationManager.GetName(Object) den angegebenen Namen in der Namenstabelle des Serialisierungs-Managers nicht finden kann.

IDesignerSerializationManager.SerializationComplete

Tritt ein, wenn die Serialisierung abgeschlossen ist.

IDesignerSerializationManager.SetName(Object, String)

Legt den Namen für das angegebene Objekt fest.

IServiceProvider.GetService(Type)

Eine Beschreibung dieses Members finden Sie unter der GetService(Type)-Methode.

Gilt für:

Weitere Informationen