ExtensionDataObject Classe

Definição

Armazena dados de um contrato de dados com controle de versão que foi estendido adicionando novos membros.Stores data from a versioned data contract that has been extended by adding new members.

public ref class ExtensionDataObject sealed
public sealed class ExtensionDataObject
type ExtensionDataObject = class
Public NotInheritable Class ExtensionDataObject
Herança
ExtensionDataObject

Exemplos

O código a seguir serializa uma instância de um tipo ( PersonVersion2 ) que é a segunda versão do tipo serializável ( Person ).The following code serializes an instance of a type (PersonVersion2) that is the second version of the serializable type (Person). A segunda versão contém dados extras ( ID campo) que não estão presentes na primeira versão.The second version contains extra data (ID field) that is not present in the first version. Em seguida, o código desserializa o documento XML em um Person objeto e, em seguida, reserializa imediatamente o objeto, incluindo os dados adicionais.The code then deserializes the XML document into a Person object, then immediately reserializes the object including the extra data. Por fim, o código desserializa o novo XML em um PersonVersion2 objeto e grava os dados completos no console, comprovando que os dados fizeram uma viagem de ida e volta de uma versão mais antiga do tipo.Finally, the code deserializes the new XML into a PersonVersion2 object and writes the complete data to the console, proving that the data has made a round trip to and from an older version of the type. Observe que o DataContractAttribute atributo deve ser aplicado com as Name Namespace Propriedades e definidas para o mesmo nome e namespace que a classe original.Note that the DataContractAttribute attribute must be applied with the Name and Namespace properties set to the same name and namespace as the original class.

using System;
using System.Xml;
using System.Runtime.Serialization;
using System.IO;

// Implement the IExtensibleDataObject interface
// to store the extra data for future versions.
[DataContract(
    Name = "Person",
    Namespace = "http://www.cohowinery.com/employees")]
class Person : IExtensibleDataObject
{
    // To implement the IExtensibleDataObject interface,
    // you must implement the ExtensionData property. The property
    // holds data from future versions of the class for backward
    // compatibility.
    private ExtensionDataObject extensionDataObject_value;
    public ExtensionDataObject ExtensionData
    {
        get
        {
            return extensionDataObject_value;
        }
        set
        {
            extensionDataObject_value = value;
        }
    }
    [DataMember]
    public string Name;
}

// The second version of the class adds a new field. The field's
// data is stored in the ExtensionDataObject field of
// the first version (Person). You must also set the Name property
// of the DataContractAttribute to match the first version.
// If necessary, also set the Namespace property so that the
// name of the contracts is the same.
[DataContract(Name = "Person",
    Namespace = "http://www.cohowinery.com/employees")]
class PersonVersion2 : IExtensibleDataObject
{
    // Best practice: add an Order number to new members.
    [DataMember(Order=2)]
    public int ID;

    [DataMember]
    public string Name;

    private ExtensionDataObject extensionDataObject_value;
    public ExtensionDataObject ExtensionData
    {
        get
        {
            return extensionDataObject_value;
        }
        set
        {
            extensionDataObject_value = value;
        }
    }
}
public sealed class Program
{
    private Program()
    {
        // Private constructor to prevent creation of this class.
    }

    public static void Main()
    {
        try
        {
            WriteVersion2("V2.xml");
            WriteToVersion1("v2.xml");
            ReadVersion2("v2.xml");
        }
        catch (SerializationException exc)
        {
            Console.WriteLine("{0}: {1}", exc.Message, exc.StackTrace);
        }
        finally
        {
            Console.ReadLine();
        }
    }

    // Create an instance of the version 2.0 class. It has
    // extra data (ID field) that version 1.0 does
    // not understand.
    static void WriteVersion2(string path)
    {
        Console.WriteLine("Creating a version 2 object");
        PersonVersion2 p2 = new PersonVersion2();
        p2.Name = "Elizabeth";
        p2.ID = 2006;

        Console.WriteLine("Object data includes an ID");
        Console.WriteLine("\t Name: {0}", p2.Name);
        Console.WriteLine("\t ID: {0} \n", p2.ID);
        // Create an instance of the DataContractSerializer.
        DataContractSerializer ser =
            new DataContractSerializer(typeof(PersonVersion2));

        Console.WriteLine("Serializing the v2 object to a file. \n\n");
        FileStream fs = new FileStream(path, FileMode.Create);
        ser.WriteObject(fs, p2);
        fs.Close();
    }

    // Deserialize version 2 data to a version 1 object.
    static void WriteToVersion1(string path)
    {
        // Create the serializer using the version 1 type.
        DataContractSerializer ser =
            new DataContractSerializer(typeof(Person));

        FileStream fs = new FileStream(path, FileMode.Open);
        XmlDictionaryReader reader =
           XmlDictionaryReader.CreateTextReader(fs, new XmlDictionaryReaderQuotas());
        Console.WriteLine
            ("Deserializing v2 data to v1 object. \n\n");

        Person p1 = (Person)ser.ReadObject(reader, false);

        Console.WriteLine("V1 data has only a Name field.");
        Console.WriteLine("But the v2 data is stored in the ");
        Console.WriteLine("ExtensionData property. \n\n");
        Console.WriteLine("\t Name: {0} \n", p1.Name);

        fs.Close();

        // Change data in the object.
        p1.Name = "John";
        Console.WriteLine("Changed the Name value to 'John' ");
        Console.Write("and reserializing the object to version 2 \n\n");
        // Reserialize the object.
        fs = new FileStream(path, FileMode.Create);
        ser.WriteObject(fs, p1);
        fs.Close();
    }

    // Deserialize a version 2.0 object.
    public static void ReadVersion2(string path)
    {
        FileStream fs = new FileStream(path, FileMode.Open);
        DataContractSerializer ser = new DataContractSerializer(typeof(PersonVersion2));

        Console.WriteLine("Deserializing new data to version 2 \n\n");
        PersonVersion2 p2 = (PersonVersion2)ser.ReadObject(fs);
        fs.Close();

        Console.WriteLine("The data includes the old ID field value. \n");
        Console.WriteLine("\t (New) Name: {0}", p2.Name);
        Console.WriteLine("\t ID: {0} \n", p2.ID);
    }
}
' Implement the IExtensibleDataObject interface 
' to store the extra data for future versions.
<DataContract(Name := "Person", [Namespace] := "http://www.cohowinery.com/employees")>  _
Class Person
    Implements IExtensibleDataObject
    ' To implement the IExtensibleDataObject interface,
    ' you must implement the ExtensionData property. The property
    ' holds data from future versions of the class for backward
    ' compatibility.
    Private extensionDataObject_value As ExtensionDataObject
    
    Public Property ExtensionData() As ExtensionDataObject _
       Implements IExtensibleDataObject.ExtensionData
        Get
            Return extensionDataObject_value
        End Get
        Set
            extensionDataObject_value = value
        End Set
    End Property
    <DataMember()>  _
    Public Name As String
End Class 

' The second version of the class adds a new field. The field's 
' data is stored in the ExtensionDataObject field of
' the first version (Person). You must also set the Name property 
' of the DataContractAttribute to match the first version. 
' If necessary, also set the Namespace property so that the 
' name of the contracts is the same.

<DataContract(Name := "Person", [Namespace] := "http://www.cohowinery.com/employees")>  _
Class PersonVersion2
    Implements IExtensibleDataObject

    ' Best practice: add an Order number to new members.
    <DataMember(Order:=2)>  _
    Public ID As Integer
    
    <DataMember()>  _
    Public Name As String
    
    Private extensionDataObject_value As ExtensionDataObject
    
    Public Property ExtensionData() As ExtensionDataObject _
       Implements IExtensibleDataObject.ExtensionData
        Get
            Return extensionDataObject_value
        End Get
        Set
            extensionDataObject_value = value
        End Set
    End Property
End Class 

NotInheritable Public Class Program

    ' Private constructor to prevent creation of this class.
    Private Sub New() 
    
    End Sub 
    
    
    Public Shared Sub Main() 
        Try
            WriteVersion2("V2.xml")
            WriteToVersion1("v2.xml")
            ReadVersion2("v2.xml")
        Catch exc As SerializationException
            Console.WriteLine("{0}: {1}", exc.Message, exc.StackTrace)
        Finally
            Console.ReadLine()
        End Try
    
    End Sub 
    
    ' Create an instance of the version 2.0 class. It has  
    ' extra data (ID field) that version 1.0 does 
    ' not understand.
    Shared Sub WriteVersion2(ByVal path As String) 
        Console.WriteLine("Creating a version 2 object")
        Dim p2 As New PersonVersion2()
        p2.Name = "Elizabeth"
        p2.ID = 2006
        
        Console.WriteLine("Object data includes an ID")
        Console.WriteLine(vbTab + " Name: {0}", p2.Name)
        Console.WriteLine(vbTab + " ID: {0} " + vbLf, p2.ID)
        ' Create an instance of the DataContractSerializer.
        Dim ser As New DataContractSerializer(GetType(PersonVersion2))
        
        Console.WriteLine("Serializing the v2 object to a file. " + vbLf + vbLf)
        Dim fs As New FileStream(path, FileMode.Create)
        ser.WriteObject(fs, p2)
        fs.Close()
    End Sub 
    
    ' Deserialize version 2 data to a version 1 object.
    Shared Sub WriteToVersion1(ByVal path As String) 
        ' Create the serializer using the version 1 type.
        Dim ser As New DataContractSerializer(GetType(Person))
        
        Dim fs As New FileStream(path, FileMode.Open)
        Dim reader As XmlDictionaryReader = _
            XmlDictionaryReader.CreateTextReader(fs, New XmlDictionaryReaderQuotas())
        Console.WriteLine("Deserializing v2 data to v1 object. " + vbLf + vbLf)
        
        Dim p1 As Person = CType(ser.ReadObject(reader, False), Person)
        
        Console.WriteLine("V1 data has only a Name field.")
        Console.WriteLine("But the v2 data is stored in the ")
        Console.WriteLine("ExtensionData property. " + vbLf + vbLf)
        Console.WriteLine(vbTab + " Name: {0} " + vbLf, p1.Name)
        
        reader.Close()
        fs.Close()
        
        ' Change data in the object.
        p1.Name = "John"
        Console.WriteLine("Changed the Name value to 'John' ")
        Console.Write("and reserializing the object to version 2 " + vbLf + vbLf)
        ' Reserialize the object.
        fs = New FileStream(path, FileMode.Create)
        ser.WriteObject(fs, p1)
        fs.Close()
    
    End Sub 
    
    ' Deserialize a version 2.0 object. 
    Public Shared Sub ReadVersion2(ByVal path As String) 
        Dim fs As New FileStream(path, FileMode.Open)
        Dim ser As New DataContractSerializer(GetType(PersonVersion2))
        
        Console.WriteLine("Deserializing new data to version 2 " + vbLf + vbLf)
        Dim p2 As PersonVersion2 = CType(ser.ReadObject(fs), PersonVersion2)
        fs.Close()
        
        Console.WriteLine("The data includes the old ID field value. " + vbLf)
        Console.WriteLine(vbTab + " (New) Name: {0}", p2.Name)
        Console.WriteLine(vbTab + " ID: {0} " + vbLf, p2.ID)
    
    End Sub 
End Class 

Comentários

O ExtensionDataObject é a estrutura que armazena dados extras encontrados pelo XmlObjectSerializer durante operações de desserialização.The ExtensionDataObject is the structure that stores extra data encountered by the XmlObjectSerializer during deserialization operations. A estrutura é usada pela serialização para gravar os dados extras na instância serializada.The structure is used by serialization to write the extra data into the serialized instance. A estrutura é retornada pela ExtensionData propriedade da IExtensibleDataObject interface.The structure is returned by the ExtensionData property of the IExtensibleDataObject interface.

Métodos

Equals(Object)

Determina se o objeto especificado é igual ao objeto atual.Determines whether the specified object is equal to the current object.

(Herdado de Object)
GetHashCode()

Serve como a função de hash padrão.Serves as the default hash function.

(Herdado de Object)
GetType()

Obtém o Type da instância atual.Gets the Type of the current instance.

(Herdado de Object)
MemberwiseClone()

Cria uma cópia superficial do Object atual.Creates a shallow copy of the current Object.

(Herdado de Object)
ToString()

Retorna uma cadeia de caracteres que representa o objeto atual.Returns a string that represents the current object.

(Herdado de Object)

Aplica-se a

Confira também