4

从我们的 Android 应用程序到 WCF 服务的一些请求会导致以下错误:

System.Runtime.Serialization.SerializationException:反序列化 xxx.SaveChangesCommand 类型的对象时出错。'�rg�rden' 包含无效的 UTF8 字节。---> System.Xml.XmlException: '�rg�rden' 包含无效的 UTF8 字节。---> System.Text.DecoderFallbackException:无法将索引 0 处的字节 [E6] 从指定代码页转换为 Unicode。

在 System.Text.DecoderExceptionFallbackBuffer.Throw(Byte[] bytesUnknown, Int32 index) 在 System.Text.DecoderExceptionFallbackBuffer.Fallback(Byte[] bytesUnknown, Int32 index) 在 System.Text.DecoderFallbackBuffer.InternalFallback(Byte[] bytes, Byte* pBytes, Char*& chars) 在 System.Text.UTF8Encoding.FallbackInvalidByteSequence(Byte*& pSrc, Int32 ch, DecoderFallbackBuffer fallback, Char*& pTarget) 在 System.Text.UTF8Encoding.GetChars(Byte* bytes, Int32 byteCount, Char* chars, Int32 charCount, DecoderNLS baseDecoder) 在 System.Text.UTF8Encoding.GetChars(Byte[] bytes, Int32 byteIndex, Int32 byteCount, Char[] chars, Int32 charIndex) 在 System.Xml.XmlConverter.ToChars(Byte[] 缓冲区, Int32 偏移量、Int32 计数、Char[] 字符、Int32 charOffset)

--- End of inner exception

堆栈跟踪---在 System.Xml.XmlConverter.ToChars(Byte[] buffer, Int32 offset, Int32 count, Char[] chars, Int32 charOffset) at System.Xml.XmlBufferReader.GetChars(Int32 offset, Int32 length, Char[ ] chars) 在 System.Xml.XmlBufferReader.GetString(Int32 offset, Int32 length) 在 System.Xml.ValueHandle.GetString() 在 System.Xml.XmlBaseReader.ReadContentAsString() 在 System.Xml.XmlBaseReader.ReadElementContentAsString() 在 ReadArrayOfstringFromJson (XmlReaderDelegator,XmlObjectSerializerReadContextComplexJson,XmlDictionaryString,XmlDictionaryString,CollectionDataContract)在 System.Runtime.Serialization.Json.JsonCollectionDataContract.ReadJsonValueCore(XmlReaderDelegator jsonReader,XmlObjectSerializerReadContextComplexJson 上下文)在 System.Runtime.Serialization.Json.JsonDataContract。ReadJsonValue(XmlReaderDelegator jsonReader, XmlObjectSerializerReadContextComplexJson context) 在 System.Runtime.Serialization.XmlObjectSerializerReadContext.InternalDeserialize(XmlReaderDelegator reader, String name, String ns, Type declaredType, DataContract & dataContract) at System.Runtime.Serialization.XmlObjectSerializerReadContext.InternalDeserialize(XmlReaderDelegator, Int32 xmlReader ,在 System.Runtime.Serialization.Json.JsonClassDataContract.ReadJsonValueCore(XmlReaderDelegator jsonReader, XmlObjectSerializerReaderComplexJson) 处的 ReadSaveShoppingListChangesCommandFromJson (XmlReaderDelegator, XmlObjectSerializerReadContextComplexJson, XmlDictionaryString, XmlDictionaryString[] ) .JsonDataContract.ReadJsonValue(XmlReaderDelegator jsonReader, XmlObjectSerializerReadContextComplexJson 上下文) 在 System.Runtime.Serialization.XmlObjectSerializerReadContext.InternalDeserialize(XmlReaderDelegator reader, String name, String ns, Type declaredType, DataContract & dataContract) at System.Runtime.Serialization.XmlObjectSerializerReadContext.InternalDeserialize,(XmlReaderDelegator在 System.Runtime.Serialization.Json.DataContractJsonSerializer.InternalReadObject(XmlReaderDelegator xmlReader, Boolean verifyObjectName) 在 System.Runtime.Serialization.XmlObjectSerializer.ReadObjectHandleExceptions(XmlReaderDelegator reader, Boolean verifyObjectName, DataContractResolver dataContractResolver )ReadJsonValue(XmlReaderDelegator jsonReader,XmlObjectSerializerReadContextComplexJson 上下文)在 System.Runtime.Serialization.XmlObjectSerializerReadContext.InternalDeserialize(XmlReaderDelegator 阅读器,字符串名称,字符串 ns,类型声明类型,DataContract 和 dataContract)在 System.Runtime.Serialization.XmlObjectSerializerReadContext.InternalDeserialize(XmlReaderDelegator xmlReader 声明, DataContract dataContract, String name, String ns) at System.Runtime.Serialization.Json.DataContractJsonSerializer.InternalReadObject(XmlReaderDelegator xmlReader, Boolean verifyObjectName) at System.Runtime.Serialization.XmlObjectSerializer.ReadObjectHandleExceptions(XmlReaderDelegator reader, Boolean verifyObjectName, DataContractResolver dataContractResolver)ReadJsonValue(XmlReaderDelegator jsonReader,XmlObjectSerializerReadContextComplexJson 上下文)在 System.Runtime.Serialization.XmlObjectSerializerReadContext.InternalDeserialize(XmlReaderDelegator 阅读器,字符串名称,字符串 ns,类型声明类型,DataContract 和 dataContract)在 System.Runtime.Serialization.XmlObjectSerializerReadContext.InternalDeserialize(XmlReaderDelegator xmlReader 声明, DataContract dataContract, String name, String ns) at System.Runtime.Serialization.Json.DataContractJsonSerializer.InternalReadObject(XmlReaderDelegator xmlReader, Boolean verifyObjectName) at System.Runtime.Serialization.XmlObjectSerializer.ReadObjectHandleExceptions(XmlReaderDelegator reader, Boolean verifyObjectName, DataContractResolver dataContractResolver)XmlObjectSerializerReadContextComplexJson context) 在 System.Runtime.Serialization.XmlObjectSerializerReadContext.InternalDeserialize(XmlReaderDelegator reader, String name, String ns, Type declaredType, DataContract& dataContract) 在 System.Runtime.Serialization.XmlObjectSerializerReadContext.InternalDeserialize(XmlReaderDelegator xmlReader, Type declaredType, DataContract dataContract, String名称,字符串 ns) 在 System.Runtime.Serialization.Json.DataContractJsonSerializer.InternalReadObject(XmlReaderDelegator xmlReader, Boolean verifyObjectName) 在 System.Runtime.Serialization.XmlObjectSerializer.ReadObjectHandleExceptions(XmlReaderDelegator reader, Boolean verifyObjectName, DataContractResolver dataContractResolver)XmlObjectSerializerReadContextComplexJson context) 在 System.Runtime.Serialization.XmlObjectSerializerReadContext.InternalDeserialize(XmlReaderDelegator reader, String name, String ns, Type declaredType, DataContract& dataContract) 在 System.Runtime.Serialization.XmlObjectSerializerReadContext.InternalDeserialize(XmlReaderDelegator xmlReader, Type declaredType, DataContract dataContract, String名称,字符串 ns) 在 System.Runtime.Serialization.Json.DataContractJsonSerializer.InternalReadObject(XmlReaderDelegator xmlReader, Boolean verifyObjectName) 在 System.Runtime.Serialization.XmlObjectSerializer.ReadObjectHandleExceptions(XmlReaderDelegator reader, Boolean verifyObjectName, DataContractResolver dataContractResolver)System.Runtime.Serialization.XmlObjectSerializerReadContext.InternalDeserialize(XmlReaderDelegator xmlReader, Type declaredType, DataContract dataContract, String name, String ns) 在 System.Runtime. System.Runtime.Serialization.XmlObjectSerializer.ReadObjectHandleExceptions 处的 Serialization.Json.DataContractJsonSerializer.InternalReadObject(XmlReaderDelegator xmlReader, Boolean verifyObjectName) (XmlReaderDelegator reader, Boolean verifyObjectName, DataContractResolver dataContractResolver)System.Runtime.Serialization.XmlObjectSerializerReadContext.InternalDeserialize(XmlReaderDelegator xmlReader, Type declaredType, DataContract dataContract, String name, String ns) 在 System.Runtime. System.Runtime.Serialization.XmlObjectSerializer.ReadObjectHandleExceptions 处的 Serialization.Json.DataContractJsonSerializer.InternalReadObject(XmlReaderDelegator xmlReader, Boolean verifyObjectName) (XmlReaderDelegator reader, Boolean verifyObjectName, DataContractResolver dataContractResolver)System.Runtime.Serialization.Json.DataContractJsonSerializer.InternalReadObject(XmlReaderDelegator xmlReader, Boolean verifyObjectName) 在 System.Runtime.Serialization.XmlObjectSerializer.ReadObjectHandleExceptions (XmlReaderDelegator 读取器,布尔型 verifyObjectName,DataContractResolver dataContractResolver)System.Runtime.Serialization.Json.DataContractJsonSerializer.InternalReadObject(XmlReaderDelegator xmlReader, Boolean verifyObjectName) 在 System.Runtime.Serialization.XmlObjectSerializer.ReadObjectHandleExceptions (XmlReaderDelegator 读取器,布尔型 verifyObjectName,DataContractResolver dataContractResolver)XmlObjectSerializer.ReadObjectHandleExceptions(XmlReaderDelegator 读取器,布尔值 verifyObjectName,DataContractResolver dataContractResolver)XmlObjectSerializer.ReadObjectHandleExceptions(XmlReaderDelegator 读取器,布尔值 verifyObjectName,DataContractResolver dataContractResolver)

--- 内部异常堆栈跟踪结束 ---
在 System.Runtime.Serialization.XmlObjectSerializer.ReadObjectHandleExceptions(XmlReaderDelegator reader,Boolean verifyObjectName,DataContractResolver dataContractResolver)在 System.Runtime.Serialization.Json.DataContractJsonSerializer.ReadObject(XmlDictionaryReader reader,Boolean verifyObjectName)在 System.ServiceModel.Dispatcher.SingleBodyParameterMessageFormatter.DeserializeRequest(消息消息,Object[] 参数)在 System.ServiceModel.Dispatcher.DemultiplexingDispatchMessageFormatter.DeserializeRequest(消息消息,Object[] 参数)在 System.ServiceModel.Dispatcher.UriTemplateDispatchFormatter.DeserializeRequest(消息消息,Object[] 参数)在 System.ServiceModel System.ServiceModel 处的 .Dispatcher.DispatchOperationRuntime.DeserializeInputs(MessageRpc& rpc)。Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc& rpc) 在 System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc& rpc) 在 System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage31(MessageRpc& rpc) 在 System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet )

我一直在寻找一些类似的案例,我发现了这个链接:
Configuring the .NET WCF UTF-8 deserializer to modify/discard non-shortest form chars instead of throwing an exception?
使用非最短形式可能修复 UTF-8 的错误 - 如果是这种情况,在我看来。

但我不明白为什么这个修复是必要的,因为如此处所述:
https ://blogs.oracle.com/CoreJavaTechTips/entry/the_overhaul_of_java_utf

新的 UTF-8 字符集实现已集成在 JDK7、Open JDK 6、JDK 6 update 11 及更高版本、JDK5.0u17 和 1.4.2_19 中。

当我查看请求时,我看到:

HTTP_USER_AGENT:Apache-HttpClient/不可用(java 1.4

但是Android应用是用jdk1.7.0_13编译的

我应该如何解决这个问题?

4

1 回答 1

0

我认为 XML 不完全是 UTF-8 格式。请参阅 '�rg�rden' 类型的文本可能是 UTF-8 的其他格式。像 ISO 8859-1 之类的。

所以尝试用 UTF-8 编码文本,它可能会工作:)

于 2015-10-09T19:38:06.753 回答