Можно ли десериализовать веб-ответ, если он входит в куски с Jil без блокировки потоков?
Десериализация чанков за куском веб-ответа бесплатна, поскольку время настенных часов связано с тем, что время ожидания чанков обычно намного больше времени десериализации. Однако существующее решение:
var streamReader = new System.IO.StreamReader(responseStream);
var deserialized = Jil.JSON.Deserialize<Result>(streamReader);
блокирует поток до тех пор, пока ответ не будет завершен, что приводит к остановке системы в сценариях с высоким уровнем параллелизма. Использовать Jil
с асинхронным чтением ответа нам нужно что-то вроде
var chunkDeserializer = new JilChunkDeserializer<Response>();
chunkDeserializer.Consume(buffer, offset, length); //with baked-in string encoding
//chunkDeserializer.Consume(stringChunk); alternative with one extra allocation per chunk
с var deserialised = chunkDeserializer.Finalize()
вызывается, когда все данные были записаны. Есть ли что-то похожее в Джиле? Если нет, можно ли будет это реализовать? Умеренная потеря производительности была бы бессмысленной из-за того, что она поглощается временем ожидания чанка.
1 ответ
В настоящее время это невозможно с Jil, он может десериализовать только полные документы JSON.
Говоря гипотетически: я не уверен, что это будет на самом деле быстрее, потому что Джил должен был бы иметь возможность хранить свое состояние (чтобы впоследствии возобновить), когда он исчерпал ввод. Прямо сейчас большая часть этого состояния находится в стеке, перемещение его в кучу может стоить дороже во время выполнения, чем вы бы сэкономили.