2010-11-24 5 views
6

Sehen Sie sich den folgenden Code von here an.
Es geht darum, zirkuläre Referenzen in einem Datenkontrakt (Objektmodell, Objektgraph, Domänenmodell) beim Serialisieren in wcf zu erhalten.Endlosschleife in einem Codebeispiel bei Serialisierung

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*/); 
     } 
    } 

Ist das nicht CreateDataContractSerializer eine Endlosschleife Erzeugen (Stackoverflow) - und damit auch die vorhergehenden CreateSerializer Methode?

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

Nun werden diese Methoden vielleicht nicht verwendet? Was fehlt mir hier?

Antwort

3

Es scheint tatsächlich so. Die Tatsache, dass es funktioniert, legt nahe, dass derzeit nur die letzte Überladung aufgerufen wird. Da es verschiedene Parameter gibt, wäre es vielleicht besser, die statische Methode zu verlieren (das hilft nicht):

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*/); 
}