2010-08-13 20 views
6

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

Respuesta

12
[field:NonSerialized] 
public event PropertyChangedEventHandler PropertyChanged; 

Esto le dice al DataContractSerializer, "no serializar el campo generado automáticamente EventHandlerList para este evento". Por lo tanto, cualquier instancia de objeto asociada a su evento no se considerará parte del gráfico objeto que se serializa.

+0

impresionante. ¡Funcionó! ¿Esta información está disponible en MSDN? –

Cuestiones relacionadas