Android应用程序请求WCF服务(SerializationException-utf-8相关)



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

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

在System.Text.DoderExceptionFallbackBuffer.Sthrow(Byte[]字节未知,Int32索引)System.Text.DoderExceptionFallbackBuffer.Fallback(Byte[]字节未知,Int32索引)System.Text.DoderFallbackBuffer.InteralFallback(Byte[]字节,Byte*pBytes,Char*&字符)System.Text.UTF8Encoding.FallbackInvalidByteSequence(Byte*&pSrc,Int32 ch,DecoderFallbackBuffer回退,Char*&pTarget)System.Text.UTF8Encoding.GetChars(Byte*字节,Int32字节计数,Char*chars,Int32 charCount,解码器基于NLS的解码器)System.Text.UTF8Encoding.GetChars(Byte[]字节,Int32字节索引,Int32字节计数,Char[]个字符,Int32个字符索引)System.Xml.XmlConverter.ToChars(Byte[]缓冲区,Int32偏移量,Int32count,Char[]chars,Int32 charOffset)

--- End of inner exception

堆栈跟踪---在System.Xml.XmlConverter.ToChars(Byte[]缓冲区,Int32偏移量,Int32计数,Char[]字符,Int32字符偏移量)System.Xml.XmlBufferReader.GetChars(Int32偏移量,Int32长度,Char[]chars)在System.Xml.XmlBufferReader.GetString(Int32偏移量,Int32length)的System.Xml.ValueHandle.GetString()位于的System.Xml.XmlBaseReader.ReadContentAsString()位于的System.Xml.XmlBaseReader.ReadElementContentAsString()ReadArrayOfstringFromJson(XmlReaderDelegator,XmlObjectSerializerReadContextComplexJson、XmlDictionaryString、,XmlDictionaryString,CollectionDataContract)System.Runtime.Serialization.Json.JsonCollectionDataContract.ReadJsonValueCore(XmlReaderDelegatorjsonReader、XmlObjectSerializerReadContextComplexJson上下文)System.Runtime.Serialization.Json.JsonDataContract.ReadJsonValue(XmlReaderDelegatorjsonReader、XmlObjectSerializerReadContextComplexJson上下文)System.Runtime.Serialization.XmlObjectSerializerReadContext.InteralDeserialize(XmlReaderDelegatorreader,字符串名称,字符串ns,类型declardType,DataContract&dataContract)System.Runtime.Serialization.XmlObjectSerializerReadContext.InteralDeserialize(XmlReaderDelegatorxmlReader,Int32 id,RuntimeTypeHandle declardTypeHandle,字符串name,字符串ns)ReadSaveShoppingListChangesCommandFromJson(XmlReaderDelegator,XmlObjectSerializerReadContextComplexJson、XmlDictionaryString、,XmlDictionaryString[])System.Runtime.Serialization.Json.JsonClassDataContract.ReadJsonValueCore(XmlReaderDelegatorjsonReader、XmlObjectSerializerReadContextComplexJson上下文)System.Runtime.Serialization.Json.JsonDataContract.ReadJsonValue(XmlReaderDelegatorjsonReader、XmlObjectSerializerReadContextComplexJson上下文)System.Runtime.Serialization.XmlObjectSerializerReadContext.InteralDeserialize(XmlReaderDelegatorreader,字符串名称,字符串ns,类型declardType,DataContract&dataContract)System.Runtime.Serialization.XmlObjectSerializerReadContext.InteralDeserialize(XmlReaderDelegatorxmlReader,类型declardType,DataContract DataContract,字符串名称,字符串ns)System.Runtime.Serialization.Json.DataContractJsonSerializer.InternalReadObject(XmlReaderDelegatorxmlReader,布尔verifyObjectName)System.Runtime.Serialization.XmlObjectSerializer.ReadObjectHandleExceptions(XmlReaderDelegator读取器,布尔verifyObjectName,DataContractResolverdataContractResolver)

---内部异常堆栈跟踪结束---
位于System.Runtime.Serialization.XmlObjectSerializer.ReadObjectHandleExceptions(XmlReaderDelegator读取器,布尔verifyObjectName,DataContractResolverdataContractResolver)System.Runtime.Serialization.Json.DataContractJsonSerializer.ReadObject(XmlDictionaryReader读取器,布尔verifyObjectName)System.ServiceModel.Dispatcher.SingleBodyParameterMessageFormatter.DescializeRequest(消息消息,Object[]参数)System.ServiceModel.Dispatcher.DemultiplexingDispatchMessageFormatter.DescializeRequest(Message消息,Object[]参数)System.ServiceModel.Dispatcher.UriTemplateDispatchFormatter.DescializeRequest(消息消息,Object[]参数)System.ServiceModel.Dispatcher.DispatchOperationRuntime.DescializeInputs(MessageRpc&rpc)System.ServiceModel.Dispatcher.DispatchOperationRuntime.IInvokeBegin(MessageRpc&rpc)System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc&rpc)System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage31(MessageRpc&rpc)在System.ServiceModel.Dispatcher.MessageRpc.Process(布尔isOperationContextSet)

我一直在寻找一些类似的情况,并找到了以下链接:
配置.NET WCF UTF-8反序列化程序以修改/丢弃非最短形式的字符,而不是引发异常
使用非最短格式的UTF-8可能会修复错误-如果我觉得是这种情况的话。

但我不明白为什么有必要进行此修复,因为如这里所述:
https://blogs.oracle.com/CoreJavaTechTips/entry/the_overhaul_of_java_utf

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

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

HTTP_USER_AGENT:Apache HttpClient/UNAVAILABLE(java 1.4)

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

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

我认为XML不完全是UTF-8格式。请参阅�rg�rden类型的文本可能是UTF-8的另一种格式。比如ISO 8859-1之类的。

因此,尝试用UTF-8对文本进行编码,它可能会起作用:)

最新更新