Sdílet prostřednictvím


Přehled serializace návrháře

Návrhář serializace můžete stát součástí přetrvávají v době návrhu nebo běhu.

Serializace pro objekty

.NET Framework Podporuje několik typů serializace generování kódu, serializace, binární serializace a XML serializace SOAP.

Serializace návrháře je zvláštní formou serializace, která zahrnuje typ objektu perzistence obvykle spojené s nástroji pro vývoj.Návrhář serializace je proces převodu grafu objektů do zdrojového souboru, který můžete později použít k obnovení graf objektů.Zdrojový soubor může obsahovat kód, označení nebo dokonce i informace o tabulce SQL.Serializace návrháře funguje pro všechny běžné objekty language runtime.

Serializace návrháře se liší od serializace objektu typické několika způsoby:

  • Provádění serializace je odděleně od spuštění objektu tak, aby návrh logiky lze odebrat ze součásti.

  • Schéma serializace byly připraveny za předpokladu, že objekt bude vytvořen v plně inicializována státu a upravit prostřednictvím vlastnosti a metody vyvolání během deserialization.

  • Vlastnosti objektu, které jsou hodnoty, které byly nastaveny nikdy objektu nebyli serializováni.Naopak rekonstrukci proudu může inicializovat všechny hodnoty vlastností.Podrobnější popis serializace pravidla v části "Obecná pravidla serializace" dále v tomto tématu.

  • Důraz na kvalitu obsahu v rámci serializace datového proudu, nikoli celou serializaci objektu.Pokud žádným způsobem definovaným serializovat objekt objektu předán místo vyvolá výjimku.Serializace návrháře má způsoby serializaci objektu, jednoduché a srozumitelnou formou, nikoli jako neprůhledný objekt blob.

  • Serializace datového proudu může mít více dat, než je nutné pro rekonstrukci.Kód uživatele kombinovaný s kódem potřebné k rekonstrukci grafu objektů má například zdrojový kód serializace.Tento kód uživatele, musí být zachovány na serializace a předán rekonstrukci.

[!POZNÁMKA]

Při běhu, jakož i návrhu lze návrháře serializace.

Následující tabulka uvádí cíle návrhu splněny s .NET Framework návrháře serializace infrastruktury.

Cílem návrhu

Description

Modulární

Serializace proces lze rozšířit na nové datové typy a tyto datové typy může poskytovat užitečné, srozumitelnou popisy samy.

Snadno rozšiřitelné

Serializace proces lze rozšířit na pokrytí snadno nové datové typy.

Formát neutrální

Objekty se mohou účastnit v mnoha různých formátech a návrháře serializace nejsou vázány na konkrétní data formátu.

Architektura

Architektura návrháře serializace je založena na metadata, serializers a správce serializace.Následující tabulka popisuje role každého aspektu architektury.

Aspekt

Description

Atributy metadat

Atribut se používá k propojení typu t s některé převodník do sériového tvaru S.Architektura podporuje také "bootstrapping" atribut, který lze použít k objektu, který může poskytnout serializers typů, které nemají jejich instalaci.

Serializers

Serializátor je objekt, který lze serializovat určitého typu nebo rozsah typů.Je základní třída pro každý formát data.Například může být DemoXmlSerializer základní třída, ve které lze objekt převést do formátu XML.Architektura je nezávislé na libovolný formát serializace určité a zahrnuje také implementace této architektury, postavený na kód modelu objektu dokumentu (CodeDOM).

Správce serializace

Správce serializace je objekt, který obsahuje úložiště informací pro různé serializers, které se používají k serializaci grafu objektů.Graf objektů 50 pravděpodobně 50 různých serializers, že všechny vlastní výstup generovat.Správce serializace používá tyto serializers se vzájemně komunikovat.

Následující obrázek a postup ukazují, jak lze serializovat objekty grafu, v tomto případě a a B.

Serializace grafu objektu

Při serializaci objekty grafu

  1. Volající serializátor pro objekt a vyžaduje od správce serializace:

    MySerializer s = manager.GetSerializer(a);
    
  2. Atribut a metadata a sváže typu serializátoru požadovaného typu.Volající poté požádá serializátor serializace A:

    Blob b = s.Serialize(manager, a);
    
  3. Serializační procedura objektu a řadí A.Pro každý objekt, který nalezne při serializaci a požaduje další serializers ze správce serializace:

    MySerializer s2 = manager.GetSerializer(b);
    Blob b2 = s2.Serialize(manager, b);
    
  4. Výsledek serializace je vráceno:

    Blob b = ...
    

Obecná pravidla serializace

Součást obvykle poskytuje řadu vlastností.Například model Windows Forms Button ovládací prvek má vlastnosti BackColor, ForeColor, a BackgroundImage.Když umístíte Button ovládacího prvku ve formuláři Návrhář a zobrazit generovaný kód, najdete je pouze podmnožina vlastností uložených v kódu.Obvykle jsou to vlastnosti, pro které jste explicitně nastavit hodnotu.

CodeDomSerializer Přidružené Button řízení definuje chování serializace.Následující seznam popisuje některá pravidla používaná CodeDomSerializer serializace hodnotu vlastnosti:

  • Pokud má vlastnost DesignerSerializationVisibilityAttribute k němu připojené používá toto serializátor určení, pokud je vlastnost serializovat (stejně jako Visible nebo Hidden) a jak serializovat (Content).

  • Visible Nebo Hidden hodnoty zadat, pokud je vlastnost serializovat.Content Hodnota určuje, jak je vlastnost serializovat.

  • Vlastnost nazývá DemoProperty, pokud komponenta implementuje metodu s názvem ShouldSerializeDemoProperty, návrhového prostředí zavolá pozdní vazbou tato metoda k určení, zda serializovat.Například BackColor vlastnost, je volána metoda ShouldSerializeBackColor.

  • Pokud má vlastnost DefaultValueAttribute zadán, výchozí hodnota je porovnána s aktuální hodnotou součásti.Vlastnost serializovat, pouze pokud je aktuální hodnota než výchozí.

  • Návrháře spojeného s komponentou hrát v rozhodování serializace podle části zastínění vlastnosti nebo provádění ShouldSerialize metody samotného.

[!POZNÁMKA]

Serializátor odkládat údaje serializace rozhodnutí PropertyDescriptor spojené s vlastností a PropertyDescriptor používá pravidla dříve uvedeny.

Pokud chcete serializovat komponenty jiným způsobem, můžete napsat vlastní serializátor třídy, který je odvozen od CodeDomSerializer a přidružit pomocí komponenty DesignerSerializerAttribute.

Inteligentní serializátor implementace

Jedním z požadavků serializátor návrhu je nový formát serializace je potřeba, všechny typy dat je třeba aktualizovat s atributem metadata na podporu tohoto formátu.Však využívání poskytovatelů serializace společně s serializers, které používají generického objektu metadat, tento požadavek lze splnit.Tato část popisuje preferovaný způsob návrhu serializátor pro konkrétní formát tak, aby mnoho serializers pro vlastní potřebu je minimalizováno.

Následující schéma definuje hypotetických formátu XML, které bude trvalé grafu objektů.

<TypeName>
    <PropertyName>
        ValueString
    </PropertyName>
</TypeName>

Tento formát je serializovat pomocí vymyšlený třídy, nazvané DemoXmlSerializer.

public abstract class DemoXmlSerializer 
{
    public abstract string Serialize(
        IDesignerSerializationManager m, 
        object graph);
}

Je důležité vědět, že DemoXmlSerializer je modulární třída, která vytvoří řetězec z kusů.Například DemoXmlSerializer pro Int32 typ dat vrátí řetězec "23" při předání celé hodnoty 23.

Zprostředkovatelé serializace

Předchozí příklad schématu umožňuje vymazat, existují dva základní typy zpracování:

  • Objekty, které mají podřízené vlastnosti.

  • Objekty, které lze převést na text.

Bylo by obtížné adorn každé třídy s vlastní Serializační procedura, která třídy lze převést na text nebo značky XML.Zprostředkovatelé serializace vyřešit tím, že poskytuje mechanismus zpětného volání, ve kterém je objekt dána příležitost poskytnout serializátor pro daný typ.V tomto příkladu je k dispozici sadu typů omezen na následující podmínky:

  • Pokud typ lze převést na řetězec pomocí IConvertible rozhraní, StringXmlSerializer bude použita.

  • Pokud typ nelze převést na řetězec, ale je veřejné a má prázdný konstruktor ObjectXmlSerializer bude použita.

  • Pokud ani jedno z těchto pravdivá, serializace zprostředkovatel vrátí null, což označuje, že žádné serializátor pro objekt.

Následující příklad kódu ukazuje, jak dojde k volání serializátor řeší, co se stane s touto chybou.

internal class XmlSerializationProvider : IDesignerSerializationProvider 
{
    object GetSerializer(
        IDesignerSerializationManager manager, 
        object currentSerializer, 
        Type objectType, 
        Type serializerType) 
    {

        // Null values will be given a null type by this serializer.
        // This test handles this case.
        if (objectType == null) 
        {
            return StringXmlSerializer.Instance;
        }

        if (typeof(IConvertible).IsSubclassOf(objectType)) 
        {
            return StringXmlSerializer.Instance;
        }

        if (objectType.GetConstructor(new object[]) != null) 
        {
            return ObjectXmlSerializer.Instance;
        }

        return null;
    }
}

Po definování serializace Zprostředkovatel musí umístit použít.Správce serializace může být poskytnuta prostřednictvím zprostředkovatele serializace AddSerializationProvider metoda, ale to vyžaduje provedení volání správce serializace.Serializace zprostředkovatele lze automaticky přidat do správce serializace přidáním DefaultSerializationProviderAttribute převodníku do sériového tvaru.Tento atribut vyžaduje zprostředkovatele serializace veřejnosti, prázdný konstruktor.Následující příklad kódu ukazuje nezbytné změnit na DemoXmlSerializer.

[DefaultSerializationProvider(typeof(XmlSerializationProvider))]
public abstract class DemoXmlSerializer 
{
}

Nyní, kdykoliv správce serializace dotaz pro každý typ DemoXmlSerializer, výchozí zprostředkovatel serializace bude přidán do správce serializace, pokud není jeho stalo již.

Serializers

Vzorek DemoXmlSerializer třída má dvě konkrétní serializátor třídy s názvem StringXmlSerializer a ObjectXmlSerializer.Následující příklad kódu ukazuje provádění StringXmlSerializer.

internal class StringXmlSerializer : DemoXmlSerializer
{
    internal StringXmlSerializer Instance = new StringXmlSerializer();

    public override string Serialize(
        IDesignerSerializationManager m, 
        object graph) 
    {

        if (graph == null) return string.Empty;

        IConvertible c = graph as IConvertible;
        if (c == null) 
        {
            // Rather than throwing exceptions, add a list of errors 
            // to the serialization manager.
            m.ReportError("Object is not IConvertible");
            return null;
        }

    return c.ToString(CultureInfo.InvariantCulture);
    }
}

ObjectXmlSerializer Implementace je komplikovanější, protože je nutné provést výčet veřejné vlastnosti objektu.Následující příklad kódu ukazuje provádění ObjectXmlSerializer.

internal class ObjectXmlSerializer : DemoXmlSerializer 
{
    internal ObjectXmlSerializer Instance = new ObjectXmlSerializer();

    public override string Serialize(
        IDesignerSerializationManager m, 
        object graph) 
    {

        StringBuilder xml = new StringBuilder();
        xml.Append("<");
        xml.Append(graph.GetType().FullName);
        xml.Append(">");

        // Now, walk all the properties of the object.
        PropertyDescriptorCollection properties;
        Property p;

        properties = TypeDescriptor.GetProperties(graph);

        foreach(p in properties) 
        {
            if (!p.ShouldSerializeValue(graph)) 
            {
                continue;
            }

            object value = p.GetValue(graph);
            Type valueType = null;
            if (value != null) valueType = value.GetType();

            // Get the serializer for this property
            DemoXmlSerializer s = m.GetSerializer(
                valueType, 
                typeof(DemoXmlSerializer)) as DemoXmlSerializer;

            if (s == null) 
            {
                // Because there is no serializer, 
                // this property must be passed over.  
                // Tell the serialization manager
                // of the error.
                m.ReportError(string.Format(
                    "Property {0} does not support XML serialization",
                    p.Name));
                continue;
            }

            // You have a valid property to write.
            xml.Append("<");
            xml.Append(p.Name);
            xml.Append(">");

            xml.Append(s.Serialize(m, value);

            xml.Append("</");
            xml.Append(p.Name);
            xml.Append(">");
        }

        xml.Append("</");
        xml.Append(graph.GetType().FullName);
        xml.Append(">");
        return xml.ToString();
    }
}

ObjectXmlSerializerVyvolá další serializers pro každou hodnotu vlastnosti.To má dvě výhody.První, umožňuje ObjectXmlSerializer být velmi jednoduché.Za druhé představuje bod rozšiřitelnosti jiných typů.Pokud ObjectXmlSerializer typ, který nelze zapsat některým z těchto serializers vlastní Serializační procedura může být poskytován typu nabídnuty.

Použití

Použití těchto nových serializers instanci IDesignerSerializationManager musí být vytvořen.Z této instance požádejte o serializátor a potom požádat serializátor pro serializovat objekty.Následující kód například Rectangle bude pro objekt serializovat, protože má prázdný konstruktor a tento typ čtyři vlastnosti, které podporují IConvertible.Místo provádění IDesignerSerializationManager sami, můžete použít provádění podle DesignerSerializationManager.

Rectangle r = new Rectangle(5, 10, 15, 20);
DesignerSerializationManager m = new DesignerSerializationManager();
DemoXmlSerializer x = (DemoXmlSerializer)m.GetSerializer(
    r.GetType(), typeof(DemoXmlSerializer);

string xml = x.Serialize(m, r);

To vedlo následující XML.

<System.Drawing.Rectangle>
<X>
5
</X>
<Y>
10
</Y>
<Width>
15
</Width>
<Height>
15
</Height>
</System.Drawing.Rectangle>

[!POZNÁMKA]

XML nejsou odsazeny.To může snadno provést až Context vlastnost IDesignerSerializationManager.Každou úroveň serializátor nelze přidat objekt do zásobník kontextu, který obsahuje aktuální úroveň odsazení a každý serializátor nelze hledat objektu v zásobníku a používat k odsazení.

Viz také

Referenční dokumentace

IDesignerSerializationManager

DesignerSerializationManager

DefaultSerializationProviderAttribute

IConvertible

CodeDomSerializerBase

Další zdroje

Rozšíření podpory během návrhu