ExtensionDataObject Třída
Definice
Důležité
Některé informace platí pro předběžně vydaný produkt, který se může zásadně změnit, než ho výrobce nebo autor vydá. Microsoft neposkytuje žádné záruky, výslovné ani předpokládané, týkající se zde uváděných informací.
Ukládá data ze kontraktu dat s verzí, který byl prodloužen přidáním nových členů.
public ref class ExtensionDataObject sealed
public sealed class ExtensionDataObject
type ExtensionDataObject = class
Public NotInheritable Class ExtensionDataObject
- Dědičnost
-
ExtensionDataObject
Příklady
Následující kód serializuje instanci typu (PersonVersion2
), která je druhou verzí serializovatelného typu (Person
). Druhá verze obsahuje další data (ID
pole), která nejsou k dispozici v první verzi. Kód pak deserializuje dokument XML do objektu Person
a poté okamžitě přeeerializuje objekt včetně dodatečných dat. Nakonec kód deserializuje nový KÓD XML do objektu PersonVersion2
a zapíše kompletní data do konzoly, což dokazuje, že data udělala zpáteční cestu do a ze starší verze typu. Všimněte si DataContractAttribute , že atribut musí být použit s vlastnostmi Name a nastavenými Namespace na stejný název a obor názvů jako původní třída.
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
Poznámky
Je ExtensionDataObject struktura, ve které se ukládají další data, se kterými se XmlObjectSerializer při operacích deserializace setkáte. Struktura se používá serializace k zápisu dalších dat do serializované instance. Struktura je vrácena ExtensionData vlastností IExtensibleDataObject rozhraní.
Metody
Equals(Object) |
Určí, zda se zadaný objekt rovná aktuálnímu objektu. (Zděděno od Object) |
GetHashCode() |
Slouží jako výchozí hashovací funkce. (Zděděno od Object) |
GetType() |
Získá aktuální Type instanci. (Zděděno od Object) |
MemberwiseClone() |
Vytvoří mělkou kopii aktuálního Objectsouboru . (Zděděno od Object) |
ToString() |
Vrátí řetězec, který představuje aktuální objekt. (Zděděno od Object) |