Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 11 additions & 2 deletions src/MongoDB.Bson/IO/JsonReader.cs
Original file line number Diff line number Diff line change
Expand Up @@ -111,15 +111,24 @@ public JsonReader(TextReader textReader, JsonReaderSettings settings)
{
}

private JsonReader(JsonBuffer buffer, JsonReaderSettings settings)
internal JsonReader(JsonBuffer buffer, JsonReaderSettings settings)
: base(settings)
{
_buffer = buffer;
_jsonReaderSettings = settings; // already frozen by base class
_context = new JsonReaderContext(null, ContextType.TopLevel);
}

// public methods
// public methods
/// <summary>
/// Resets the underlying buffer; use this if you are streaming very large BSON documents and want to reduce memory
/// use.
/// </summary>
public void DiscardBufferedData()
{
_buffer.ResetBuffer();
}

/// <summary>
/// Closes the reader.
/// </summary>
Expand Down
33 changes: 33 additions & 0 deletions tests/MongoDB.Bson.Tests/IO/JsonReaderTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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<BsonDocument>(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<BsonDocument>(reader);
}

reader.ReadEndArray();
}
}
}

public static class JsonReaderReflector
Expand Down