Ich versuche, einen kleinen Ausschnitt von XML mit dem DataContractSerializer deserialise:DataContractSerializer: SerializationException ‚Endelement‘ ist nicht zu erwarten
<iopbase:SoapFaultException xmlns:iopbase=""http://example.com/foo/"">
<faultcode></faultcode>
<faultstring>Hello World</faultstring>
</iopbase:SoapFaultException>
Das Problem ist die DataContractSerializer nicht ‚sehen‘ die <faultcode>
und <faultstring>
Elemente und ich erhalte die folgende Ausnahme:
SerializationException: 'EndElement' 'SoapFaultException' from namespace
'http://example.com/foo/' is not expected. Expecting element 'faultcode'.
Hier ist eine abgespeckte Stück Code, das Problem zu reproduzieren:
[DataContract(Namespace = "http://example.com/foo/")]
public class SoapFaultException
{
[DataMember(IsRequired = true)]
public string faultcode { get; set; }
[DataMember(IsRequired = true)]
public string faultstring { get; set; }
}
var xml = System.Xml.Linq.XElement.Parse(@"
<iopbase:SoapFaultException xmlns:iopbase=""http://example.com/foo/"">
<faultcode></faultcode>
<faultstring>Hello World</faultstring>
</iopbase:SoapFaultException>");
var serializer = new DataContractSerializer(typeof(SoapFaultException));
var e = (SoapFaultException) serializer.ReadObject(xml.CreateReader()); <- Exception Here
Und schließlich, Stack-Trace der Ausnahme.
at System.Runtime.Serialization.XmlObjectSerializerReadContext.ThrowRequiredMemberMissingException(XmlReaderDelegator xmlReader, Int32 memberIndex, Int32 requiredIndex, XmlDictionaryString[] memberNames)
at ReadSoapFaultExceptionFromXml(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, 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(XmlReader reader)
at XXX.Program.Main() in C:\Git\XXX\Program.cs:line 161
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.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()
es jetzt offensichtlich scheint, dass Sie die untergeordneten Elemente zu einem Namensraum gehören nicht darauf hin! Ich habe Ihren Vorschlag für die Zusammenfassung und Unterklasse verwendet. Vielen Dank! – jameskind