KnownTypeAttribute Clase
Definición
Especifica tipos que deberá reconocer DataContractSerializer al serializar o deserializar un tipo determinado.Specifies types that should be recognized by the DataContractSerializer when serializing or deserializing a given type.
public ref class KnownTypeAttribute sealed : Attribute
[System.AttributeUsage(System.AttributeTargets.Class | System.AttributeTargets.Struct, AllowMultiple=true, Inherited=true)]
public sealed class KnownTypeAttribute : Attribute
[<System.AttributeUsage(System.AttributeTargets.Class | System.AttributeTargets.Struct, AllowMultiple=true, Inherited=true)>]
type KnownTypeAttribute = class
inherit Attribute
Public NotInheritable Class KnownTypeAttribute
Inherits Attribute
- Herencia
- Atributos
Ejemplos
El ejemplo siguiente muestra un tipo denominado Person
y un tipo denominado IDInformation
que se deberá reconocer al serializar o deserializar el tipo Person
.The following example shows a type named Person
and a type named IDInformation
that should be recognized when serializing or deserializing the Person
type.
using System;
using System.Collections.Generic;
using System.Collections;
using System.Text;
using System.IO;
using System.Runtime.Serialization;
namespace KnownTypeAttributeExample
{
class Program
{
static void Main(string[] args)
{
try
{
Serialize("KnownTypeAttributeExample.xml");
Deserialize("KnownTypeAttributeExample.xml");
// Run this twice. The second time, comment out the
// Serialize call and comment out the
// KnownTypeAttribute on the Person class. The
// deserialization will then fail.
}
catch (SerializationException exc)
{
Console.WriteLine("{0}: {1}", exc.Message,
exc.StackTrace);
}
finally
{
Console.WriteLine("Press Enter to exit...");
Console.ReadLine();
}
}
public static void Serialize(string path)
{
Person p = new Person();
p.Miscellaneous.Add(DateTime.Now, "Hello");
p.Miscellaneous.Add(DateTime.Now.AddSeconds(1), "World");
IDInformation w = new IDInformation();
w.ID = "1111 00000";
p.Miscellaneous.Add(DateTime.Now.AddSeconds(2), w);
DataContractSerializer ser =
new DataContractSerializer(typeof(Person));
FileStream fs = new FileStream(path, FileMode.Create);
using (fs)
{
ser.WriteObject(fs, p);
}
}
public static void Deserialize(string path)
{
DataContractSerializer ser =
new DataContractSerializer(typeof(Person));
FileStream fs = new FileStream(path, FileMode.Open);
using (fs)
{
Person p2 = (Person)ser.ReadObject(fs);
Console.WriteLine("Count {0}", p2.Miscellaneous.Count);
foreach (DictionaryEntry de in p2.Miscellaneous)
{
Console.WriteLine("Key {0} Value: {1}", de.Key,
de.Value);
if (de.Value.GetType() == typeof(IDInformation))
{
IDInformation www = (IDInformation)de.Value;
Console.WriteLine(
"\t Found ID Information. ID: {0} \n", www.ID);
}
}
}
}
// Apply the KnownTypeAttribute to the class that
// includes a member that returns a Hashtable.
[KnownType(typeof(IDInformation))]
[DataContract]
public class Person : IExtensibleDataObject
{
private ExtensionDataObject ExtensionDataObjectValue;
public ExtensionDataObject ExtensionData
{
get { return ExtensionDataObjectValue; }
set { ExtensionDataObjectValue = value; }
}
private Hashtable MiscellaneousValue = new Hashtable();
[DataMember]
public Hashtable Miscellaneous
{
get { return MiscellaneousValue; }
set { MiscellaneousValue = value; }
}
}
[DataContract]
public class IDInformation : IExtensibleDataObject
{
private ExtensionDataObject ExtensionDataValue;
public ExtensionDataObject ExtensionData
{
get { return ExtensionDataValue; }
set { ExtensionDataValue = value; }
}
[DataMember]
public string ID;
}
}
}
Imports System.Collections.Generic
Imports System.Collections
Imports System.Text
Imports System.IO
Imports System.Runtime.Serialization
Imports System.Xml
Class Program
Shared Sub Main(ByVal args() As String)
Try
Serialize("KnownTypeAttributeExample.xml")
Deserialize("KnownTypeAttributeExample.xml")
' Run this twice. The second time, comment out the
' Serialize call and comment out the
' KnownTypeAttribute on the Person class. The
' deserialization will then fail.
Catch exc As SerializationException
Console.WriteLine("{0}: {1}", exc.Message, exc.StackTrace)
Finally
Console.WriteLine("Press Enter to exit...")
Console.ReadLine()
End Try
End Sub
Public Shared Sub Serialize(ByVal path As String)
Dim p As New Person()
p.Miscellaneous.Add(DateTime.Now, "Hello")
p.Miscellaneous.Add(DateTime.Now.AddSeconds(1), "World")
Dim w As New IDInformation()
w.ID = "1111 00000"
p.Miscellaneous.Add(DateTime.Now.AddSeconds(2), w)
Dim ser As New DataContractserializer(GetType(Person))
Using fs As New FileStream(path, FileMode.OpenOrCreate)
ser.WriteObject(fs, p)
End Using
End Sub
Public Shared Sub Deserialize(ByVal path As String)
Dim ser As New DataContractserializer(GetType(Person))
Using fs As New FileStream(path, FileMode.OpenOrCreate)
Dim p2 As Person = ser.ReadObject(fs)
Console.WriteLine("Count {0}", p2.Miscellaneous.Count)
For Each de As DictionaryEntry In p2.Miscellaneous
Console.WriteLine("Key {0} Value: {1}", de.Key, _
de.Value)
If TypeOf (de.Value) Is IDInformation Then
Dim www As IDInformation = de.Value
Console.WriteLine( _
"Found ID Information. ID: {0}", www.ID)
End If
Next
End Using
End Sub
' Apply the KnownTypeAttribute to the class that
' includes a member that returns a Hashtable.
<System.Runtime.Serialization.KnownType(GetType(IDInformation))> _
<DataContract()> _
Public Class Person
Implements IExtensibleDataObject
Private MiscellaneousValue As New Hashtable()
Private ExtensionDataObjectValue As ExtensionDataObject
Public Property ExtensionData() As ExtensionDataObject _
Implements IExtensibleDataObject.ExtensionData
Get
Return ExtensionDataObjectValue
End Get
Set(ByVal value As ExtensionDataObject)
ExtensionDataObjectValue = value
End Set
End Property
<DataMember()> _
Public Property Miscellaneous() As Hashtable
Get
Return MiscellaneousValue
End Get
Set(ByVal value As Hashtable)
MiscellaneousValue = value
End Set
End Property
End Class
<DataContract()> _
Public Class IDInformation
Implements IExtensibleDataObject
Private ExtensionDataObjectValue As ExtensionDataObject
Public Property ExtensionData() As ExtensionDataObject _
Implements IExtensibleDataObject.ExtensionData
Get
Return ExtensionDataObjectValue
End Get
Set(ByVal value As ExtensionDataObject)
ExtensionDataObjectValue = value
End Set
End Property
<DataMember()> _
Public ID As String
End Class
End Class
Comentarios
Aplique el atributo KnownTypeAttribute a un tipo para indicar a DataContractSerializer los tipos que deberá reconocer al serializar o deserializar una instancia del tipo al que se aplica el atributo.Apply the KnownTypeAttribute attribute to a type to indicate to the DataContractSerializer types that should be recognized when serializing or deserializing an instance of the type to which the attribute is applied. Otros serializadores que comprendan los contratos de datos también podrían reconocer este atributo.This attribute could also be recognized by other serializers that understand data contracts.
Nota
En el código, se puede usar la palabra KnownType
en lugar de KnownTypeAttribute
, que resulta más largo.In your code, you can use the word KnownType
instead of the longer KnownTypeAttribute
.
Se puede aplicar exactamente una instancia KnownTypeAttribute con la propiedad MethodName establecida, o bien una o más instancias KnownTypeAttribute con la propiedad Type establecida.You can either apply exactly one KnownTypeAttribute instance with the MethodName property set, or one or more KnownTypeAttribute instances with the Type property set.
Constructores
KnownTypeAttribute(String) |
Inicializa una nueva instancia de la clase KnownTypeAttribute con el nombre de un método que devuelve IEnumerable de tipos conocidos.Initializes a new instance of the KnownTypeAttribute class with the name of a method that returns an IEnumerable of known types. |
KnownTypeAttribute(Type) |
Inicializa una nueva instancia de la clase KnownTypeAttribute con el tipo especificado.Initializes a new instance of the KnownTypeAttribute class with the specified type. |
Propiedades
MethodName |
Obtiene el nombre de un método que devolverá una lista de tipos que se deberán reconocer durante la serialización o la deserialización.Gets the name of a method that will return a list of types that should be recognized during serialization or deserialization. |
Type |
Obtiene el tipo que DataContractSerializer deberá reconocer durante la serialización o la deserialización.Gets the type that should be recognized during serialization or deserialization by the DataContractSerializer. |
TypeId |
Cuando se implementa en una clase derivada, obtiene un identificador único para este Attribute.When implemented in a derived class, gets a unique identifier for this Attribute. (Heredado de Attribute) |
Métodos
Equals(Object) |
Devuelve un valor que indica si esta instancia es igual que un objeto especificado.Returns a value that indicates whether this instance is equal to a specified object. (Heredado de Attribute) |
GetHashCode() |
Devuelve el código hash de esta instancia.Returns the hash code for this instance. (Heredado de Attribute) |
GetType() |
Obtiene el Type de la instancia actual.Gets the Type of the current instance. (Heredado de Object) |
IsDefaultAttribute() |
Si se reemplaza en una clase derivada, indica si el valor de esta instancia es el valor predeterminado de la clase derivada.When overridden in a derived class, indicates whether the value of this instance is the default value for the derived class. (Heredado de Attribute) |
Match(Object) |
Cuando se invalida en una clase derivada, devuelve un valor que indica si esta instancia es igual a un objeto especificado.When overridden in a derived class, returns a value that indicates whether this instance equals a specified object. (Heredado de Attribute) |
MemberwiseClone() |
Crea una copia superficial del Object actual.Creates a shallow copy of the current Object. (Heredado de Object) |
ToString() |
Devuelve una cadena que representa el objeto actual.Returns a string that represents the current object. (Heredado de Object) |
Implementaciones de interfaz explícitas
_Attribute.GetIDsOfNames(Guid, IntPtr, UInt32, UInt32, IntPtr) |
Asigna un conjunto de nombres a un conjunto correspondiente de identificadores de envío.Maps a set of names to a corresponding set of dispatch identifiers. (Heredado de Attribute) |
_Attribute.GetTypeInfo(UInt32, UInt32, IntPtr) |
Obtiene la información de tipos de un objeto, que puede utilizarse para obtener la información de tipos de una interfaz.Retrieves the type information for an object, which can be used to get the type information for an interface. (Heredado de Attribute) |
_Attribute.GetTypeInfoCount(UInt32) |
Recupera el número de interfaces de información de tipo que proporciona un objeto (0 ó 1).Retrieves the number of type information interfaces that an object provides (either 0 or 1). (Heredado de Attribute) |
_Attribute.Invoke(UInt32, Guid, UInt32, Int16, IntPtr, IntPtr, IntPtr, IntPtr) |
Proporciona acceso a las propiedades y los métodos expuestos por un objeto.Provides access to properties and methods exposed by an object. (Heredado de Attribute) |