2010-11-24 22 views
6

Regardez le code suivant de here.
Il s'agit de préserver les références circulaires dans un contrat de données (modèle objet, graphe d'objets, modèle de domaine) lors de la sérialisation dans wcf.Boucle sans fin dans un exemple de code sur la sérialisation

class ReferencePreservingDataContractSerializerOperationBehavior 
     :DataContractSerializerOperationBehavior 
    { 
     public ReferencePreservingDataContractSerializerOperationBehavior(
      OperationDescription operationDescription) 
      : base(operationDescription) { } 

     public override XmlObjectSerializer CreateSerializer(
      Type type, string name, string ns, IList<Type> knownTypes) 
     { 
      return CreateDataContractSerializer(type, name, ns, knownTypes); 
     } 

     private static XmlObjectSerializer CreateDataContractSerializer(
      Type type, string name, string ns, IList<Type> knownTypes) 
     { 
      return CreateDataContractSerializer(type, name, ns, knownTypes); 
     } 

     public override XmlObjectSerializer CreateSerializer(
      Type type, XmlDictionaryString name, XmlDictionaryString ns, 
      IList<Type> knownTypes) 
     { 
      return new DataContractSerializer(type, name, ns, knownTypes, 
       0x7FFF /*maxItemsInObjectGraph*/, 
       false/*ignoreExtensionDataObject*/, 
       true/*preserveObjectReferences*/, 
       null/*dataContractSurrogate*/); 
     } 
    } 

Is not CreateDataContractSerializer génération d'une boucle sans fin (stackoverflow) - et donc aussi le procédé précédent CreateSerializer?

private static XmlObjectSerializer CreateDataContractSerializer(
      Type type, string name, string ns, IList<Type> knownTypes) 
     { 
      return CreateDataContractSerializer(type, name, ns, knownTypes); 
     } 

Maintenant, peut-être que ces méthodes ne sont pas utilisées? Qu'est-ce que j'oublie ici?

Répondre

3

Il en est effectivement ainsi. Le fait que cela fonctionne suggère que seule la dernière surcharge est actuellement invoquée. Puisqu'il y a différents paramètres impliqués, il serait peut-être préférable de perdre la méthode statique (cela n'aide pas):

public override XmlObjectSerializer CreateSerializer(
    Type type, string name, string ns, IList<Type> knownTypes) 
{ 
    return new DataContractSerializer(type, name, ns, knownTypes, 
     0x7FFF /*maxItemsInObjectGraph*/, 
     false/*ignoreExtensionDataObject*/, 
     true/*preserveObjectReferences*/, 
     null/*dataContractSurrogate*/); 
} 

public override XmlObjectSerializer CreateSerializer(
    Type type, XmlDictionaryString name, XmlDictionaryString ns, 
    IList<Type> knownTypes) 
{ 
    return new DataContractSerializer(type, name, ns, knownTypes, 
     0x7FFF /*maxItemsInObjectGraph*/, 
     false/*ignoreExtensionDataObject*/, 
     true/*preserveObjectReferences*/, 
     null/*dataContractSurrogate*/); 
}