Android-приложение запрашивает службу WCF (SerializationException – связанный с utf-8)

Некоторые запросы из нашего приложения Android в службу WCF приводят к следующей ошибке:

System.Runtime.Serialization.SerializationException: произошла ошибка десериализации объекта типа xxx.SaveChangesCommand. « rg rden» содержит недопустимые байты UTF8. —> System.Xml.XmlException: ' rg rden' содержит недопустимые байты UTF8. —> System.Text.DecoderFallbackException: Невозможно перевести байты [E6] в индекс 0 с указанной кодовой страницы в Юникод.

В 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 (байты * байты, Int32 byteCount, Char * Chars, Int32 charCount, DecoderNLS baseDecoder) в System.Text.UTF8Encoding.GetChars (байты [] байты, Int32 byteIndex, Int32 byteCount, Char [] chars, Int32 charIndex) в System.Xml.XmlConverter.ToChars (Byte [] buffer, Int32 offset, Int32 count, Char [] chars, Int32 charOffset)

--- End of inner exception 

Трассировка стека — в System.Xml.XmlConverter.ToChars (буфер байта [], смещение Int32, количество Int32, Char [] chars, Int32 charOffset) в System.Xml.XmlBufferReader.GetChars (смещение Int32, длина Int32, 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) в System.Runtime.Serialization.XmlObjectSerializerReadContext.InternalDeserialize (XmlReaderDelegator re Адер, имя String, String нс, тип declaredType, DataContract & DataContract) при System.Runtime.Serialization.XmlObjectSerializerReadContext.InternalDeserialize (XmlReaderDelegator XMLReader, Int32 идентификатор, RuntimeTypeHandle declaredTypeHandle, имя String, String нс) на ReadSaveShoppingListChangesCommandFromJson (XmlReaderDelegator, XmlObjectSerializerReadContextComplexJson, XmlDictionaryString, XmlDictionaryString []) в System.Runtime.Serialization.Json.JsonClassDataContract.ReadJsonValueCore (XmlReaderDelegator jsonReader, контекст XmlObjectSerializerReadContextComplexJson) при System.Runtime.Serialization.Json.JsonDataContract.ReadJsonValue (XmlReaderDelegator jsonReader, XmlObjectSerializerReadContextComplexJson контекст) в System.Runtime.Serialization.XmlObjectSerializerReadContext. InternalDeserialize (XmlReaderDelegator reader, String name, String ns, Type declarationType, DataContract & dataContract) в System.Runtime.Serialization.XmlObjectSerializerReadContext.InternalDeserialize (XmlReade RDelegator xmlReader, Тип объявленType, DataContract dataContract, String name, 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.XmlObjectSerializer.ReadObjectHandleExceptions (XmlReaderDelegator читатель, булева verifyObjectName, DataContractResolver dataContractResolver) в System.Runtime.Serialization.Json.DataContractJsonSerializer.ReadObject (считыватель XmlDictionaryReader, булева verifyObjectName) в System.ServiceModel.Dispatcher.SingleBodyParameterMessageFormatter.DeserializeRequest ( Message message, Object []) в System.ServiceModel.Dispatcher.DemultiplexingDispatchMessageFormatter.DeserializeRequest (Message message, Object [] parameters) в System.ServiceModel.Dispatcher.UriTemplateDispatchFormatter.DeserializeRequest (Message message, Object [] parameters) в System.ServiceModel .Dispatcher.DispatchOperationRuntime.DeserializeInputs (MessageRpc & rpc) в System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin (MessageRpc & rpc) в System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5 (MessageRpc & rpc) в System.ServiceModel.Dispatcher.ImmutableDi SpatchRuntime.ProcessMessage31 (MessageRpc & rpc) в System.ServiceModel.Dispatcher.MessageRpc.Process (Boolean isOperationContextSet)

Я искал некоторые подобные случаи, и я нашел эту ссылку:
Настройка десериализатора .NET WCF UTF-8 для изменения / отбрасывания не кратчайших символов формы вместо исключения исключения?
С возможным исправлением ошибки с 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 / UNAVAILABLE ( java 1.4 )

Но приложение Android скомпилировано с помощью jdk1.7.0_13

Как мне исправить эту проблему?

Я думаю, что XML не полностью в формате UTF-8. См. Текст « rg rden» может быть в другом формате UTF-8. Как и ISO 8859-1 или что-то в этом роде.

Поэтому попробуйте кодировать текст в UTF-8, и он может работать 🙂