2016-11-04 6 views
0

Есть ли возможность сделать BsonBinaryReader принять несекущий поток, например. NetworkStream?BsonBinaryReader с NetworkStream

Так что мне не нужно постоянно сохранять все данные и после этого начинать разбор его через BsonBinaryReader, но вместо этого может произойти «на лету»?

Пример:

var response = new NetworkStream(MAGIC); 
var reader = new BsonBinaryReader(response) 

while (!reader.EndOfStream) 
{ 
    if (reader.GotEnoughData()) 
    { 
     var bson = BsonSerializer.Deserialize<BsonDocument>(reader); 
    } 
} 
+0

Может быть 'BufferedStream' с буфером достаточного размера? –

+0

@ АлександрПетров: Хмм, спасибо за вход. Пробовал это, и я все еще получаю «поток не поддерживает поиск». исключение – SOK

ответ

0

Я решил проблему, используя ответ от https://stackoverflow.com/a/28036366/1435802 с 16Мб (макс BSON размера документа) буфера в качестве вклада в BsonBinaryReader.

Для иметь возможность читать до конец потока я не использовал следующее:

public static Task WhileNotEndOfStreamAsync(this Stream stream, Action action, CancellationToken token = default(CancellationToken)) 
{ 
    return Task.Run(() => { 
     try 
     { 
      while (!token.IsCancellationRequested) 
      { 
       action(); 
      } 
     } 
     catch (EndOfStreamException) 
     { 
      // Swallow the 'EndOfStream' Exception 
     } 
    }, token); 
} 

Чтобы считывать данные, пока EOS:

using (var response = new ReadSeekableStream(networkStream)) 
using (var reader = new BsonBinaryReader(response)) 
{ 
    await response.WhileNotEndOfStreamAsync(() => 
    { 
     var bson = BsonSerializer.Deserialize<BsonDocument>(reader); 
    }, token); 
} 
Смежные вопросы