Я пытаюсь deserialise небольшой фрагмент XML с DataContractSerializer:DataContractSerializer: SerializationException «EndElement» не ожидается
<iopbase:SoapFaultException xmlns:iopbase=""http://example.com/foo/"">
<faultcode></faultcode>
<faultstring>Hello World</faultstring>
</iopbase:SoapFaultException>
Проблема заключается в DataContractSerializer не «видеть» <faultcode>
и <faultstring>
элементы и я получаю следующее исключение:
SerializationException: 'EndElement' 'SoapFaultException' from namespace
'http://example.com/foo/' is not expected. Expecting element 'faultcode'.
Вот урезанная немного кода, чтобы повторить вопрос:
[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
И, наконец, трассировка стека Исключения.
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()
теперь вы отмечаете дочерние элементы не принадлежат к пространству имен кажется очевидным! Я использовал ваш реферат и предложение суб-класса. Большое спасибо! – jameskind