Мне не нравится использовать объекты MemoryStream между потоковыми интерфейсами. Они неудобны, требуют повторного поиска в начале, а также пиковое использование памяти в сложных ситуациях.
Иногда утилита будет работать только определенным образом. Возможно, он будет выводить байты [] или записывать в поток, или это поток в конвейере, из которого вы читаете, извлекая данные.
Этот сериализатор Newtonsoft JSON представляет собой утилиту, которая может записывать только в поток.
var js = new Newtonsoft.Json.JsonSerializer();
var sw = new StreamWriter(ps);
js.Serialize(sw, o);
Это проблема для меня, потому что я хочу связать:
- IEnumerable
- Сериализация JSON
- GZIP-сжатие
- HTTP к клиенту
- (Сеть)
- HTTP с сервера
- Распаковка GZIP
- десериализация JSON
- IEnumerable
Помимо трудностей, связанных с получением десериализатором JSON удобного интерфейса IEnumerable, остальные части не предоставляют интерфейс, подходящий для конвейерной обработки. Даже сторона сжатия GZIP неверна.
В идеале на стороне сервера я мог бы сделать:
IEnumerable<object> o = GetData();
var js = new Newtonsoft.Json.JsonSerialization(o);
var gz = new System.IO.Compression.GZipStream(js, System.IO.Compression.CompressionMode.Compress, true);
return new FileStreamResult(gz, "application/x-gzip");
Я мог бы расширить проект Newtonsoft, чтобы обеспечить реализацию конвейера, и я могу это сделать. Но до тех пор мне нужно решение, и я считаю, что оно требуется для других утилит (включая BCL GZipStream).
- Есть ли какие-то решения, которые позволяют эффективнее объединять такие утилиты?
- Есть ли библиотека, содержащая адаптер для таких ситуаций?
Я работаю над такой библиотекой, не ожидая, что такая библиотека будет.