2012-08-09 33 views
0

我有類:固定WCF循環引用序列

[Serializable] 
[System.Runtime.Serialization.DataContract(IsReference = true)] 
public class SymbolElem 
{ 
    public SymbolElem() // Constructor 
    { 
     Children = new List<SymbolElem>(); 
    } 

    public List<SymbolElem> Children { get; set; } 
    public string Name { get; set; } 
} 

,我會希望有一個服務,將使用命名管道回到我SymbolElem。一開始我以爲我有一個錯誤,因爲我在哪裏返回很多對象。

反正這裏是該服務的方法:

public SymbolElem TestMethod() 
{ 
    Common.SymbolElem root = new Common.SymbolElem() { 
      Name="root" 
    }; 

    Common.SymbolElem child = new Common.SymbolElem() { 
        Name = "child" 
    };     

    root.Children.Add(child); 

    return root; 
} 

這一工程確定,但是當我做這樣的事情:

public SymbolElem TestMethod() 
{ 
    Common.SymbolElem root = new Common.SymbolElem() { 
      Name="root" 
    }; 

    Common.SymbolElem child = new Common.SymbolElem() { 
        Name = "child" 
    };     

    root.Children.Add(child); 
    child.Children.add(root); // <------------ this causes an exception after returning s1!!!! 

    return root; 
} 

這裏是個例外:

System.ServiceModel.Dispatcher.NetDispatcherFaultException was unhandled 
    Message=The formatter threw an exception while trying to deserialize the message: There was an error while trying to deserialize parameter http://tempuri.org/:GetSymbolsResult. The InnerException message was ''EndElement' 'SymbolElem' from namespace 'http://schemas.datacontract.org/2004/07/SymbolFileParser.Common' is not expected. Expecting element '_x003C_BitOffset_x003E_k__BackingField'.'. Please see InnerException for more details. 
    Source=mscorlib 
    Action=http://schemas.microsoft.com/net/2005/12/windowscommunicationfoundation/dispatcher/fault 
    StackTrace: 
    Server stack trace: 
     at System.ServiceModel.Dispatcher.DataContractSerializerOperationFormatter.DeserializeParameterPart(XmlDictionaryReader reader, PartInfo part, Boolean isRequest) 
     at System.ServiceModel.Dispatcher.DataContractSerializerOperationFormatter.DeserializeParameter(XmlDictionaryReader reader, PartInfo part, Boolean isRequest) 
     at System.ServiceModel.Dispatcher.DataContractSerializerOperationFormatter.DeserializeBody(XmlDictionaryReader reader, MessageVersion version, String action, MessageDescription messageDescription, Object[] parameters, Boolean isRequest) 
     at System.ServiceModel.Dispatcher.OperationFormatter.DeserializeBodyContents(Message message, Object[] parameters, Boolean isRequest) 
     at System.ServiceModel.Dispatcher.OperationFormatter.DeserializeReply(Message message, Object[] parameters) 
     at System.ServiceModel.Dispatcher.ProxyOperationRuntime.AfterReply(ProxyRpc& rpc) 
     at System.ServiceModel.Channels.ServiceChannel.HandleReply(ProxyOperationRuntime operation, ProxyRpc& rpc) 
     at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout) 
     at System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation) 
     at System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message) 
    Exception rethrown at [0]: 
     at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg) 
     at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type) 
     at ConsoleApplication4.ServiceReference1.ISymbolFileParser.GetSymbols(String filePath) 
     at ConsoleApplication4.ServiceReference1.SymbolFileParserClient.GetSymbols(String filePath) in C:\Users\Antonio\Desktop\SymbolFileParser\ConsoleApplication4\Service References\ServiceReference1\Reference.cs:line 371 
     at ConsoleApplication4.Program.Main(String[] args) in C:\Users\Antonio\Desktop\SymbolFileParser\ConsoleApplication4\Program.cs:line 18 
     at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args) 
     at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args) 
     at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() 
     at System.Threading.ThreadHelper.ThreadStart_Context(Object state) 
     at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx) 
     at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 
     at System.Threading.ThreadHelper.ThreadStart() 
    InnerException: System.Runtime.Serialization.SerializationException 
     Message='EndElement' 'SymbolElem' from namespace 'http://schemas.datacontract.org/2004/07/SymbolFileParser.Common' is not expected. Expecting element '_x003C_BitOffset_x003E_k__BackingField'. 
     Source=System.Runtime.Serialization 
     StackTrace: 
      at System.Runtime.Serialization.XmlObjectSerializerReadContext.ThrowRequiredMemberMissingException(XmlReaderDelegator xmlReader, Int32 memberIndex, Int32 requiredIndex, XmlDictionaryString[] memberNames) 
      at ReadSymbolElemFromXml(XmlReaderDelegator , XmlObjectSerializerReadContext , XmlDictionaryString[] , XmlDictionaryString[]) 
      at System.Runtime.Serialization.ClassDataContract.ReadXmlValue(XmlReaderDelegator xmlReader, XmlObjectSerializerReadContext context) 
      at System.Runtime.Serialization.XmlObjectSerializerReadContext.ReadDataContractValue(DataContract dataContract, XmlReaderDelegator reader) 
      at System.Runtime.Serialization.XmlObjectSerializerReadContext.InternalDeserialize(XmlReaderDelegator reader, String name, String ns, Type declaredType, DataContract& dataContract) 
      at System.Runtime.Serialization.XmlObjectSerializerReadContext.InternalDeserialize(XmlReaderDelegator xmlReader, Int32 id, RuntimeTypeHandle declaredTypeHandle, String name, String ns) 
      at ReadArrayOfSymbolElemFromXml(XmlReaderDelegator , XmlObjectSerializerReadContext , XmlDictionaryString , XmlDictionaryString , CollectionDataContract) 
      at System.Runtime.Serialization.CollectionDataContract.ReadXmlValue(XmlReaderDelegator xmlReader, XmlObjectSerializerReadContext context) 
      at System.Runtime.Serialization.XmlObjectSerializerReadContext.ReadDataContractValue(DataContract dataContract, XmlReaderDelegator reader) 
      at System.Runtime.Serialization.XmlObjectSerializerReadContext.InternalDeserialize(XmlReaderDelegator reader, String name, String ns, Type declaredType, DataContract& dataContract) 
      at System.Runtime.Serialization.XmlObjectSerializerReadContext.InternalDeserialize(XmlReaderDelegator xmlReader, Type declaredType, DataContract dataContract, String name, String ns) 
      at System.Runtime.Serialization.DataContractSerializer.InternalReadObject(XmlReaderDelegator xmlReader, Boolean verifyObjectName, DataContractResolver dataContractResolver) 
      at System.Runtime.Serialization.XmlObjectSerializer.ReadObjectHandleExceptions(XmlReaderDelegator reader, Boolean verifyObjectName, DataContractResolver dataContractResolver) 
      at System.Runtime.Serialization.DataContractSerializer.ReadObject(XmlDictionaryReader reader, Boolean verifyObjectName) 
      at System.ServiceModel.Dispatcher.DataContractSerializerOperationFormatter.DeserializeParameterPart(XmlDictionaryReader reader, PartInfo part, Boolean isRequest) 
     InnerException: 
+0

您能否提供例外詳情? – Channs 2012-08-09 18:05:29

回答

2

問題是DataContractSerializer不知道如何處理循環引用。 您可以在父級上指定IsRefernce屬性。如所述here

+0

我添加了屬性'[System.Runtime.Serialization.DataContract(IsReference = true)]',這次我得到了一個不同的異常。我將盡快編輯。謝謝您的幫助。 +1指向我正確的方向! – 2012-08-09 18:20:11