diff --git a/src/MongoDB.Bson/IO/JsonReader.cs b/src/MongoDB.Bson/IO/JsonReader.cs index f33ec492c3c..a5d64f106b6 100644 --- a/src/MongoDB.Bson/IO/JsonReader.cs +++ b/src/MongoDB.Bson/IO/JsonReader.cs @@ -111,7 +111,7 @@ public JsonReader(TextReader textReader, JsonReaderSettings settings) { } - private JsonReader(JsonBuffer buffer, JsonReaderSettings settings) + internal JsonReader(JsonBuffer buffer, JsonReaderSettings settings) : base(settings) { _buffer = buffer; @@ -119,7 +119,16 @@ private JsonReader(JsonBuffer buffer, JsonReaderSettings settings) _context = new JsonReaderContext(null, ContextType.TopLevel); } - // public methods + // public methods + /// + /// Resets the underlying buffer; use this if you are streaming very large BSON documents and want to reduce memory + /// use. + /// + public void DiscardBufferedData() + { + _buffer.ResetBuffer(); + } + /// /// Closes the reader. /// diff --git a/tests/MongoDB.Bson.Tests/IO/JsonReaderTests.cs b/tests/MongoDB.Bson.Tests/IO/JsonReaderTests.cs index 823ed0dc1d3..a751992cdf8 100644 --- a/tests/MongoDB.Bson.Tests/IO/JsonReaderTests.cs +++ b/tests/MongoDB.Bson.Tests/IO/JsonReaderTests.cs @@ -1600,6 +1600,39 @@ public void IsValidBinaryDataSubTypeString_should_return_true_when_value_is_vali result.Should().BeTrue(); } } + + [Fact] + public void Can_discard_buffered_data() + { + var json = "[ " + string.Join(",", Enumerable.Repeat("{ \"a\" : { \"x\" : 1 } }", 1024)) + "]"; + var textReader = new StreamReader(new MemoryStream(Encoding.UTF8.GetBytes(json))); + + var buffer = new JsonBuffer(textReader); + using (var reader = new JsonReader(buffer, JsonReaderSettings.Defaults)) + { + reader.ReadStartArray(); + + // Deserialize some. + for (int idx = 0; idx < 512; idx++) + { + BsonSerializer.Deserialize(reader); + } + + buffer.Position.Should().BeGreaterThan(512); + + reader.DiscardBufferedData(); + + buffer.Position.Should().Be(0); + + // Make sure we can continue deserializing after the discard. + for (int idx = 0; idx < 512; idx++) + { + BsonSerializer.Deserialize(reader); + } + + reader.ReadEndArray(); + } + } } public static class JsonReaderReflector