2

J'ai une classe de base personnalisée Entity décorée avec [DataContract(IsReference = true)] et dérivant de UndoableBase de CSLA.net. Keeping IsReference est important pour conserver les données de référence d'objet.Erreur de sérialisation due à la dépendance circulaire

[Serializable] 
[DataContract(IsReference = true)] 
public abstract class Entity : UndoableBase 

Je reçois exception à la sérialisation en utilisant ci-dessous l'extrait de code:

public void SerializeToFile(string fileName, T obj) 
{ 
    _serializer = new DataContractSerializer(typeof(T)); 
    Serialize(fileName, obj); 
} 

private void Serialize(string fileName, T obj) 
{ 
    using (var fs = File.Open(fileName, FileMode.Create)) 
    { 
     _serializer.WriteObject(fs, obj); 
     fs.Close(); 
    } 
} 

System.Runtime.Serialization.InvalidDataContractException

The IsReference setting for type 'Entity' is 'True', but the same setting for its parent class 'Csla.Core.UndoableBase' is 'False'. Derived types must have the same value for IsReference as the base type. Change the setting on type 'Entity' to 'False', or on type 'Csla.Core.UndoableBase' to 'True', or do not set IsReference explicitly.

Si je supprime cette IsReference attribut tout à fait que je commence à obtenir l'erreur suivante:

Object graph for type 'XYZ' contains cycles and cannot be serialized if reference tracking is disabled.

Maintenant, mon question est de savoir comment le résoudre en changeant le IsReference réglage pour Csla.Core.UndoableBase lors de la sérialisation en utilisant une API.

En faisant des recherches sur ce sujet, je suis tombé sur ce post, qui parle d'utiliser DataContractSurrogate. S'il vous plaît aidez comment l'utiliser spécifiquement si c'est utile dans ce cas ou suggérez n'importe quelle autre technique le résolvant.

How to serialize class that derives from class decorated with DataContract(IsReference=true)?

+0

Je ne sais pas si DataContractSurrogate vous aidera ici. Qu'est-ce qui cause exactement la référence circulaire dans votre graphique: l'avez-vous identifié? Dans mon expérience, parfois la référence circulaire n'est même pas nécessaire. – CodingYoshi

+0

Vous avez raison, mais dans mon cas la dépendance circulaire existe parce que j'ai un type où je préserve la relation parent-enfant en exposant la propriété Parent du même type. –

Répondre

0

Après une lutte assez, j'ai enfin pu trouver la réponse à cette question. Il existe un constructeur surchargé qui prend l'indicateur preserveObjectReferences pour indiquer au sérialiseur de conserver les références. Dans mon cas, j'ai maintenant enlevé IsReference annotation de partout et utilisé la surcharge ci-dessous pour la sérialisation et la vie est bonne.

var serializer = new DataContractSerializer(typeof(T), knownTypes, 
      int.MaxValue /*maxObjectsInGraph*/, 
      false /*ignoreExtensionDataObject*/, 
      true /*preserveObjectReferences*/, 
      null /*dataContractSurrogate*/); 

Référence: Preserving Object Reference in WCF