ExtensionDataObject 클래스
정의
중요
일부 정보는 릴리스되기 전에 상당 부분 수정될 수 있는 시험판 제품과 관련이 있습니다. Microsoft는 여기에 제공된 정보에 대해 어떠한 명시적이거나 묵시적인 보증도 하지 않습니다.
버전이 있는 데이터 계약이 새 멤버가 추가되어 확장될 경우 계약의 데이터를 저장합니다.
public ref class ExtensionDataObject sealed
public sealed class ExtensionDataObject
type ExtensionDataObject = class
Public NotInheritable Class ExtensionDataObject
- 상속
-
ExtensionDataObject
예제
다음 코드는 직렬화 가능한Person
형식()의 두 번째 버전인 형식(PersonVersion2
)의 instance 직렬화합니다. 두 번째 버전에는 첫 번째 버전에 없는 추가 데이터(ID
필드)가 포함되어 있습니다. 그런 다음, 코드는 XML 문서를 개체로 Person
역직렬화한 다음, 추가 데이터를 포함하여 개체를 즉시 다시 역직렬화합니다. 마지막으로 코드는 새 XML을 개체로 PersonVersion2
역직렬화하고 전체 데이터를 콘솔에 기록하여 데이터가 이전 버전의 형식을 왕복했음을 증명합니다.
DataContractAttribute 및 속성을 원래 클래스와 Name 동일한 이름 및 Namespace 네임스페이스로 설정하여 특성을 적용해야 합니다.
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
설명
는 ExtensionDataObject 역직렬화 작업 중에 에서 발생하는 XmlObjectSerializer 추가 데이터를 저장하는 구조체입니다. 구조는 serialization에서 serialize된 instance 추가 데이터를 쓰는 데 사용됩니다. 구조체는 인터페이스의 ExtensionData 속성에 의해 반환됩니다 IExtensibleDataObject .
메서드
Equals(Object) |
지정된 개체가 현재 개체와 같은지 확인합니다. (다음에서 상속됨 Object) |
GetHashCode() |
기본 해시 함수로 작동합니다. (다음에서 상속됨 Object) |
GetType() |
현재 인스턴스의 Type을 가져옵니다. (다음에서 상속됨 Object) |
MemberwiseClone() |
현재 Object의 단순 복사본을 만듭니다. (다음에서 상속됨 Object) |
ToString() |
현재 개체를 나타내는 문자열을 반환합니다. (다음에서 상속됨 Object) |
적용 대상
추가 정보
.NET