У меня есть проблема, которая возникает у наших клиентов, но не возникает ни у кого из разработчиков при использовании той же версии приложения и данных.
DataContractJsonSerializer.ReadObject
выдает это исключение:
Deserialising: There was an error deserializing the object of type {type}.
The token '"' was expected but found 'Â'.
Это исключение не возникает, когда кто-либо из разработчиков или я пытаемся воспроизвести его, но постоянно возникает в клиентских системах. Все используют Windows 7 64bit.
Насколько я понимаю, это проблема с кодировкой текста, поскольку пара байтов UTF-8 из 0xC2,0x??
в конечном итоге станет Â
при преобразовании в Windows 1252 или ISO 8859-1. .
Преобразование в UTF-8 выполняется в коде:
string content = GetSerialised();
byte[] result = Encoding.UTF8.GetBytes(content);
using (var s = new MemoryStream(result))
{
var outputSerialiser = new DataContractJsonSerializer(typeof(T), null, int.MaxValue, true, null, false);
return (T) outputSerialiser.ReadObject(s);
}
content
отображается вместе с сообщением об ошибке, поэтому мы можем убедиться, что это допустимый текст JSON. Он содержит ¦
в кавычках в строке JSON (это 0xC2,0xA6
в UTF-8, поэтому вероятный виновник поврежденного символа).
Итак, у нас есть действительный JSON в экземпляре .Net string
, мы конвертируем его с помощью UTF8.GetBytes
, но когда DataContractJsonSerializer.ReadObject
читает его, мы получаем повреждение.
Любая идея, почему это происходит? Почему это происходит на одних машинах, а не на других?