April 2010 Blog Posts
Serializzazione: WCF perchè sei tu WCF - Serialization: WCF why are you WCF

Ho passato gli utlimi 3 giorni a cercare di risolvere un problema di serializzazione di un DTO gerarchico (Customer che contiene un IEnumerable<Customer>) e non ne uscivo, il bello è che la stessa cosa l’ho fatta in decine di altri casi. Il massimo del dettaglio dell’errore che riuscivo ad ottenere era ExecutionEngineException che ovviamente non serviva a nulla. Poi con il tool Microsoft Service Trace Viewer sono riuscito a capire qualcosa in più.

Le cose da sottolineare sono:
- il DTO è gerarchico come già detto
- il DTO contiene delle property di tipo IEnumerable<T>

Detto questo, alla fine da questo errore “Object Graph for Type Xxx Contains Cycles and Cannot be Serialized if Reference Tracking is Disabled” sono riuscito ad arrivare a questo articolo: http://www.codingbliss.com/cb/?p=73

In sostanza la soluzione consiste nel markare il DTO con l’attributo DataContract (che dalla versione 3.5 SP1 di WCF non è più necessario) specificando DataContract(IsReference = true):
[DataContract(IsReference = true)]
public class Person
{
    [DataMember]
    public string Name
    { get; set; }

   [DataMember]
   public IEnumerable<Person> Children
   { get; set; }
}

E tutto si è messo a funzionare. Ora devo verificare se il problema si presenta anche con WCF 4.0. Spero di no e spero di non dover più perdere giornate a risolvere un problema (bug?) come questo :-).

Matteo Migliore.

Technorati Tags: ,,
Add Comment Filed Under [ WCF - Indigo Bug ]