DesignerSerializationManager Klasa

Definicja

Zapewnia implementację interfejsu IDesignerSerializationManager .

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
Dziedziczenie
DesignerSerializationManager
Implementuje

Uwagi

Interfejs IDesignerSerializationManager został zaprojektowany tak, aby był niezależnym od formatu interfejsem obiektu, który kontroluje serializacji. Zasadniczo zapewnia kontekst i usługi serializatorom, które rzeczywiście wykonują deserializacji. IDesignerSerializationManager pomaga w procesie deserializacji przez śledzenie obiektów. Jest to podobne w technice do interfejsu IDesignerHost : projektanci rzeczywiście zapewniają interfejs użytkownika (UI) i IDesignerHost zapewnia klej, który umożliwia różnym projektantom pracę ze sobą.

Klasa DesignerSerializationManager implementuje IDesignerSerializationManagerelement . Jest on przeznaczony do zapewnienia ogólnej formy deserializacji, która jest podobna do seriizatorów czasu wykonywania, takich jak BinaryFormatter.

Klasa DesignerSerializationManager osiąga trzy cele:

  • Jest to prosty, gotowa do użycia obiekt, który może służyć do deserializacji różnych formatów.

  • Jest ogólny i nie jest powiązany z żadnym konkretnym formatem. Można go również używać do deserializacji CodeDOM, a także deserializacji znaczników.

  • Jest rozszerzalny i obsługuje różne metody serializacji, które są używane w scenariuszach kopiowania/wklejania i cofania/ponownego wykonywania.

Serializacja w czasie projektowania ma następujące różnice w serializacji obiektów w czasie wykonywania:

  • Obiekt wykonujący serializacji jest zazwyczaj oddzielony od obiektu w czasie wykonywania, dzięki czemu logika czasu projektowania może zostać usunięta ze składnika.

  • Schemat serializacji zakłada, że obiekt zostanie w pełni zainicjowany, a następnie zmodyfikowany za pomocą wywołań właściwości i metod podczas deserializacji.

  • Właściwości obiektu, które mają wartości, które nigdy nie zostały ustawione na obiekcie (właściwości zawierają wartości domyślne), nie są serializowane. Z drugiej strony strumień deserializacji może mieć otwory.

  • Nacisk kładzie się na jakość zawartości w strumieniu serializacji, a nie na pełną serializacji obiektu. Oznacza to, że jeśli nie ma zdefiniowanego sposobu serializacji obiektu, ten obiekt może zostać pominięty, a nie zgłosić wyjątku. Aparat serializacji może zapewnić heurystyki w tym miejscu, aby zdecydować, które awarie można zignorować i które są nieodwracalne.

  • Strumień serializacji może mieć więcej danych niż jest potrzebny do deserializacji. Na przykład serializacja kodu źródłowego zawiera kod użytkownika mieszany z kodem wymaganym do deserializacji grafu obiektu. Ten kod użytkownika musi być ignorowany podczas deserializacji i zachowywany w przypadku serializacji.

Ze względu na te różnice inny model serializacji ma zastosowanie do serializacji w czasie projektowania. Ten model wykorzystuje oddzielny obiekt serializatora dla każdego typu danych, który jest serializowany. Każdy serializator zapewnia swój niewielki wkład w problem jako całość. Te serializatory są koordynowane za pośrednictwem wspólnego menedżera serializacji. Menedżer serializacji jest odpowiedzialny za utrzymanie stanu między tymi różnymi serializatorami. Rozważmy na przykład następującą klasę:

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

Wystąpienie tej klasy korzystałoby z trzech różnych seriizatorów: jeden dla SampleObject, jeden dla ciągów, a drugi dla liczb całkowitych. Serializator dla SampleObject jest nazywany głównym serializatorem, ponieważ SampleObject jest elementem głównym grafu serializacji. Można również tworzyć bardziej złożone wykresy obiektów. Rozważmy na przykład, co by się stało, gdyby SampleObject zostały zmienione w następujący sposób:

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

SampleObject Umożliwia to posiadanie elementu podrzędnego, które jest innym wystąpieniem. Poniższy kod wypełnia wykres obiektu:

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

W root przypadku serializacji będą używane cztery serializatory: jeden serializator główny, jeden serializator dla podrzędnego SampleObject, jeden serializator dla int, i jeden serializator dla programu string. Serializatory są buforowane na podstawie typu, więc nie ma potrzeby tworzenia serializatora dla każdego wystąpienia programu SampleObject.

Klasa DesignerSerializationManager jest oparta na idei sesji serializacji. Sesja utrzymuje stan, do którego można uzyskać dostęp przez różne serializatory. Gdy sesja zostanie usunięta, ten stan zostanie zniszczony. Pomaga to zapewnić, że serializatory pozostają w dużej mierze bezstanowe i pomaga oczyścić serializatory, które zostały uszkodzone. W poniższych tabelach opisano sposób zarządzania stanem w sesjach i między nimi.

Stan globalny

Ten stan jest własnością obiektu menedżera serializacji, ale jest niezależny od bieżącej sesji serializacji.

Obiekt Użycie
Dostawcy serializacji Obiekty mogą dodawać się jako niestandardowi dostawcy serializacji. Ponieważ ci dostawcy są przyzwyczajeni do lokalizowania serializatorów, przeżywają sesję serializacji.

stan Session-Owned

Ten stan jest własnością sesji i jest niszczony, gdy sesja zostanie zniszczona. W związku z tym uzyskanie dostępu do właściwości lub metod, które mogłyby manipulować tym stanem, zgłosi wyjątek, jeśli menedżer serializacji nie znajduje się w aktywnej sesji.

Obiekt Użycie
ResolveName Zdarzenie Zdarzenie ResolveName jest dołączane przez serializator w celu zapewnienia dodatkowego rozpoznawania nazw. Wszystkie programy obsługi są odłączane od tego zdarzenia po zakończeniu sesji.
SerializationComplete Zdarzenie Zdarzenie SerializationComplete jest zgłaszane tuż przed likwidacją sesji. Następnie wszystkie programy obsługi są odłączone od tego zdarzenia.
Tabela nazw Menedżer serializacji przechowuje tabelę mapową między obiektami i ich nazwami. Serializatory mogą nadawać nazwy obiektów w celu łatwej identyfikacji. Ta tabela nazw jest czyszczone po zakończeniu sesji.
Pamięć podręczna serializatora Menedżer serializacji utrzymuje pamięć podręczną serializatorów, które poproszono o dostarczenie. Ta pamięć podręczna jest czyszczone po zakończeniu sesji. Metoda publiczna GetSerializer może być bezpiecznie wywoływana w dowolnym momencie, ale jej wartość jest buforowana tylko wtedy, gdy jest wywoływana z poziomu sesji.
Stos kontekstu Menedżer serializacji utrzymuje obiekt o nazwie stos kontekstu, do którego można uzyskać dostęp za pomocą Context właściwości . Serializatory mogą używać tego stosu do przechowywania dodatkowych informacji dostępnych dla innych serializatorów. Na przykład serializator, który serializuje wartość właściwości, może wypchnąć nazwę właściwości do stosu serializacji przed pytaniem o serializacji wartości. Ten stos jest czyszczone po zakończeniu sesji.
Lista błędów Menedżer serializacji utrzymuje listę błędów, które wystąpiły podczas serializacji. Ta lista, która jest dostępna za pośrednictwem właściwości, jest czyszczone po zakończeniu Errors sesji. Uzyskanie Errors dostępu do właściwości między sesjami spowoduje wyjątek.

Konstruktory

DesignerSerializationManager()

Inicjuje nowe wystąpienie klasy DesignerSerializationManager.

DesignerSerializationManager(IServiceProvider)

Inicjuje DesignerSerializationManager nowe wystąpienie klasy przy użyciu danego dostawcy usług.

Właściwości

Container

Pobiera lub ustawia kontener dla tego menedżera serializacji.

Errors

Pobiera listę błędów, które wystąpiły podczas serializacji lub deserializacji.

PreserveNames

Pobiera lub ustawia wartość wskazującą, czy CreateInstance(Type, ICollection, String, Boolean) metoda powinna sprawdzić obecność podanej nazwy w kontenerze.

PropertyProvider

Pobiera obiekt, który powinien służyć do udostępniania właściwości właściwości menedżera Properties serializacji.

RecycleInstances

Pobiera lub ustawia wartość wskazującą, czy CreateInstance(Type, ICollection, String, Boolean) zawsze utworzy nowe wystąpienie typu.

ValidateRecycledTypes

Pobiera lub ustawia wartość wskazującą, czy metoda sprawdzi, czy CreateInstance(Type, ICollection, String, Boolean) pasujące nazwy odwołują się do tego samego typu.

Metody

CreateInstance(Type, ICollection, String, Boolean)

Tworzy wystąpienie typu.

CreateSession()

Tworzy nową sesję serializacji.

Equals(Object)

Określa, czy dany obiekt jest taki sam, jak bieżący obiekt.

(Odziedziczone po Object)
GetHashCode()

Służy jako domyślna funkcja skrótu.

(Odziedziczone po Object)
GetRuntimeType(String)

Pobiera typ odpowiadający określonej nazwie typu.

GetSerializer(Type, Type)

Pobiera serializator dla danego typu obiektu.

GetService(Type)

Pobiera żądaną usługę.

GetType()

Type Pobiera wartość bieżącego wystąpienia.

(Odziedziczone po Object)
GetType(String)

Pobiera żądany typ.

MemberwiseClone()

Tworzy płytkią kopię bieżącego Objectelementu .

(Odziedziczone po Object)
OnResolveName(ResolveNameEventArgs)

ResolveName Zgłasza zdarzenie.

OnSessionCreated(EventArgs)

SessionCreated Zgłasza zdarzenie.

OnSessionDisposed(EventArgs)

SessionDisposed Zgłasza zdarzenie.

ToString()

Zwraca ciąg reprezentujący bieżący obiekt.

(Odziedziczone po Object)

Zdarzenia

SessionCreated

Występuje podczas tworzenia sesji.

SessionDisposed

Występuje, gdy sesja jest usuwana.

Jawne implementacje interfejsu

IDesignerSerializationManager.AddSerializationProvider(IDesignerSerializationProvider)

Dodaje niestandardowego dostawcę serializacji do menedżera serializacji.

IDesignerSerializationManager.Context

Pobiera stos kontekstu dla tej sesji serializacji.

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

Implementuje metodę CreateInstance(Type, ICollection, String, Boolean) .

IDesignerSerializationManager.GetInstance(String)

Pobiera wystąpienie utworzonego obiektu o określonej nazwie.

IDesignerSerializationManager.GetName(Object)

Pobiera nazwę określonego obiektu.

IDesignerSerializationManager.GetSerializer(Type, Type)

Pobiera serializator żądanego typu dla określonego typu obiektu.

IDesignerSerializationManager.GetType(String)

Pobiera typ określonej nazwy.

IDesignerSerializationManager.Properties

Implementuje Properties właściwość .

IDesignerSerializationManager.RemoveSerializationProvider(IDesignerSerializationProvider)

Usuwa wcześniej dodanego dostawcę serializacji.

IDesignerSerializationManager.ReportError(Object)

Służy do zgłaszania możliwego do odzyskania błędu w serializacji.

IDesignerSerializationManager.ResolveName

Występuje, gdy IDesignerSerializationManager.GetName(Object) nie można zlokalizować określonej nazwy w tabeli nazw menedżera serializacji.

IDesignerSerializationManager.SerializationComplete

Występuje po zakończeniu serializacji.

IDesignerSerializationManager.SetName(Object, String)

Ustawia nazwę określonego obiektu.

IServiceProvider.GetService(Type)

Aby uzyskać opis tego elementu członkowskiego, zobacz metodę GetService(Type) .

Dotyczy

Zobacz też