En mi aplicación WPF, estoy usando DataContractSerializer
para serializar el objeto. Observé que no serializa los tipos que tienen un evento o una declaración delegada. Considere el siguiente código en su defecto:Problema DataContractSerializer con campos de eventos/delegados
[Serializable]
public abstract class BaseClass
{
public string Name { get; set; }
public event PropertyChangedEventHandler PropertyChanged;
}
public class DerivedClass : BaseClass
{
public int Age { get; set; }
}
class Program
{
static void Main(string[] args)
{
DerivedClass derivedClass = new DerivedClass {Name = "Test", Age = 10};
derivedClass.PropertyChanged += (sender, eventArgs) => Console.WriteLine("hello");
DataContractSerializer serializer = new DataContractSerializer(typeof(DerivedClass));
using(FileStream stream = new FileStream("c:\\test.txt", FileMode.Create, FileAccess.ReadWrite))
{
serializer.WriteObject(stream, derivedClass);
}
}
}
Esta falla con el mensaje
Tipo 'System.DelegateSerializationHolder + DelegateEntry' con nombre de contrato de datos 'DelegateSerializationHolder.DelegateEntry: http://schemas.datacontract.org/2004/07/System' no se espera . Agregue cualquier tipo que no sea conocido estáticamente a la lista de tipos conocidos - por ejemplo, mediante el atributo KnownTypeAttribute o por agregándolos a la lista de tipos conocidos pasados a DataContractSerializer.
Traté de agregar atributos como [DataMember(IsRequired = false)]
en el evento para indicar que no se debe serializar, pero nada funcionó.
Todo funcionó cuando eliminé el atributo [Serializable]
del BaseClass
. Me pregunto por qué este comportamiento? ¿Es seguro evitar el atributo [Serializable]
?
.NET Framework versión: 3.5 SP1
impresionante. ¡Funcionó! ¿Esta información está disponible en MSDN? –