[release/11.0-preview6] Add Stream wrappers for memory and text-based types - #129811

Merged
jozkee merged 1 commit into
dotnet:release/11.0-preview6from
ViveliDuCh:backport-pr-126669
Jun 25, 2026
Merged

[release/11.0-preview6] Add Stream wrappers for memory and text-based types#129811
jozkee merged 1 commit into
dotnet:release/11.0-preview6from
ViveliDuCh:backport-pr-126669

Conversation

@ViveliDuCh

Copy link
Copy Markdown
Member

Backport of #126669 to release/11.0-preview6. See that PR for full details.

Adds new public stream wrapper APIs (StringStream, ReadOnlyMemoryStream, WritableMemoryStream, ReadOnlySequenceStream).

Fixes#82801.

Fixesdotnet#82801
Introduces standardized stream wrappers for text and memory types as
public sealed classes (`StringStream`, `ReadOnlyMemoryStream`,
`WritableMemoryStream`, and `ReadOnlySequenceStream` ) as approved in
[API
review](dotnet#82801 (comment))
([video](https://www.youtube.com/watch?v=T7xc7rARCEw&t=0h9m41s)).
### What's included
- `StringStream` (`System.IO`, CoreLib): non-seekable, read-only stream
that encodes `string` or `ReadOnlyMemory<char>` on-the-fly. Encoding is
required (no default). Never emits BOMs.
- `ReadOnlyMemoryStream` (`System.IO`, CoreLib): seekable, read-only
stream over `ReadOnlyMemory<byte>`
- `WritableMemoryStream` (`System.IO`, CoreLib): seekable, read-write
stream over `Memory<byte>` with fixed capacity
- `ReadOnlySequenceStream` (`System.Buffers`, System.Memory): seekable,
read-only stream over `ReadOnlySequence<byte>`
- Ref assembly updates for `System.Runtime` and `System.Memory`
- Updated 3 internal call sites (`ReadOnlyMemoryContent`,
`XmlPreloadedResolver`, `JsonXmlDataContract`) to use the new types
- Conformance and behavioral tests for all 4 types
### Implementation notes
- All types are `public sealed` with direct constructors: the review
moved away from factory methods on `Stream` to avoid derived-type
IntelliSense noise
- `StringStream` encodes directly into the caller's buffer in `Read()`
rather than using an internal byte buffer
- `ReadOnlyMemoryStream` and `WritableMemoryStream` derive from
`MemoryStream`.
- `TryGetBuffer` returns false and `GetBuffer` throws on the memory
stream types (no `publiclyVisible` support for now)
### Limitations
- The internal
[shared-source](https://github.com/dotnet/runtime/blob/main/src/libraries/Common/src/System/IO/ReadOnlyMemoryStream.cs)
`ReadOnlyMemoryStream` in `Common/` cannot be fully replaced:
- `System.Memory.Data` multi-targets `netstandard2.0` where the new
public type doesn't exist.
- `System.Net.Http` (net11.0 only) can adopt it directly.
### Follow-up work
- `IBufferWriter<byte>` → `Stream` wrapper (separate proposal per
[dotnet#100434](dotnet#100434))
---------
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@ViveliDuChViveliDuCh self-assigned this Jun 24, 2026
CopilotAI review requested due to automatic review settings June 24, 2026 17:44
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @dotnet/area-system-memory
See info in area-owners.md if you want to be subscribed.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This backport introduces new public stream wrapper types for text and memory-backed data (StringStream, ReadOnlyMemoryStream, WritableMemoryStream, ReadOnlySequenceStream) and wires them into the appropriate libraries (CoreLib / System.Runtime and System.Memory), along with conformance + behavioral tests and a few call-site updates to use the new APIs.

Changes:

  • Added new public stream wrapper implementations in CoreLib (System.IO) and System.Memory (System.Buffers), plus updated ref assemblies.
  • Added conformance/behavioral tests for the new stream wrappers.
  • Updated call sites and shared-source usage (including removing the internal Common ReadOnlyMemoryStream for net11.0+ and updating System.Net.Http to use the public type).

Reviewed changes

Copilot reviewed 28 out of 29 changed files in this pull request and generated no comments.

Show a summary per file
FileDescription
src/libraries/System.Private.CoreLib/src/System/IO/StringStream.csImplements StringStream (read-only, non-seekable, on-the-fly encoding).
src/libraries/System.Private.CoreLib/src/System/IO/ReadOnlyMemoryStream.csImplements ReadOnlyMemoryStream over ReadOnlyMemory<byte>.
src/libraries/System.Private.CoreLib/src/System/IO/WritableMemoryStream.csImplements WritableMemoryStream over Memory<byte> with fixed capacity.
src/libraries/System.Private.CoreLib/src/System/IO/MemoryStream.csExposes selected MemoryStream fields as private protected to support in-assembly derived wrappers.
src/libraries/System.Private.CoreLib/src/System.Private.CoreLib.Shared.projitemsIncludes new CoreLib stream wrapper sources; switches CachedCompletedInt32Task to Common-linked source.
src/libraries/System.Runtime/ref/System.Runtime.csAdds ref-surface for StringStream, ReadOnlyMemoryStream, WritableMemoryStream.
src/libraries/System.Runtime/tests/System.IO.Tests/System.IO.Tests.csprojIncludes new test files for the added stream wrapper types.
src/libraries/System.Runtime/tests/System.IO.Tests/StringStream/StringStreamTestBase.csShared test harness for validating StringStream behaviors across read APIs.
src/libraries/System.Runtime/tests/System.IO.Tests/StringStream/StringStreamTests_String.csStringStream(string, Encoding) tests across sync/async read APIs and misc behaviors.
src/libraries/System.Runtime/tests/System.IO.Tests/StringStream/StringStreamTests_Memory.csStringStream(ReadOnlyMemory<char>, Encoding) tests including slicing and surrogate edge cases.
src/libraries/System.Runtime/tests/System.IO.Tests/StringStream/StringStreamConformanceTests.csConformance test coverage for StringStream using an identity encoding for arbitrary bytes.
src/libraries/System.Runtime/tests/System.IO.Tests/ReadOnlyMemoryStream/ReadOnlyMemoryStreamTests.csBehavioral tests for ReadOnlyMemoryStream.
src/libraries/System.Runtime/tests/System.IO.Tests/ReadOnlyMemoryStream/ReadOnlyMemoryStreamConformanceTests.csStream conformance coverage for ReadOnlyMemoryStream.
src/libraries/System.Runtime/tests/System.IO.Tests/WritableMemoryStream/WritableMemoryStreamTests.csBehavioral tests for WritableMemoryStream, especially capacity semantics.
src/libraries/System.Runtime/tests/System.IO.Tests/WritableMemoryStream/WritableMemoryStreamConformanceTests.csStream conformance coverage for WritableMemoryStream.
src/libraries/System.Memory/src/System/Buffers/ReadOnlySequenceStream.csImplements ReadOnlySequenceStream over ReadOnlySequence<byte>.
src/libraries/System.Memory/src/System.Memory.csprojIncludes ReadOnlySequenceStream and links CachedCompletedInt32Task from Common.
src/libraries/System.Memory/src/Resources/Strings.resxAdds SR strings needed for ReadOnlySequenceStream exceptions.
src/libraries/System.Memory/ref/System.Memory.csAdds ref-surface for ReadOnlySequenceStream.
src/libraries/System.Memory/tests/System.Memory.Tests.csprojAdds conformance test sources and references StreamConformanceTests for the new stream wrapper.
src/libraries/System.Memory/tests/ReadOnlyBuffer/ReadOnlySequenceStream.ConformanceTests.csConformance coverage for ReadOnlySequenceStream across single/multi/fragmented sequences.
src/libraries/System.Memory/tests/ReadOnlyBuffer/NativeMemoryOwningStream.csTest helper to own/dispose unmanaged buffers used by native-memory conformance tests.
src/libraries/System.Memory/tests/ReadOnlyBuffer/NativeReadOnlyMemoryStream.ConformanceTests.csConformance coverage for ReadOnlyMemoryStream over unmanaged-backed memory.
src/libraries/System.Memory/tests/ReadOnlyBuffer/NativeWritableMemoryStream.ConformanceTests.csConformance coverage for WritableMemoryStream over unmanaged-backed memory.
src/libraries/System.Memory.Data/tests/BinaryDataTests.csAdjusts exception expectations to align with updated seek/OD behavior.
src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/Json/JsonXmlDataContract.csUses StringStream instead of allocating a UTF-8 byte[] + MemoryStream.
src/libraries/System.Net.Http/src/System.Net.Http.csprojStops linking the internal Common ReadOnlyMemoryStream (uses public CoreLib type for net11+).
src/libraries/Common/src/System/IO/ReadOnlyMemoryStream.csExcludes internal Common ReadOnlyMemoryStream on net11.0+ (public CoreLib type supersedes it).
src/libraries/Common/src/System/Threading/Tasks/CachedCompletedInt32Task.csIntroduces Common-linked cached task helper used by stream implementations.

@jozkeejozkee added the Servicing-approved Approved for servicing release label Jun 24, 2026

@jeffhandleyjeffhandley left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Great to get this into Preview 6. Has my support!

@jozkee

Copy link
Copy Markdown
Member

/ba-g known errors only and 2 legs show as unfinished but they are cancelled.

@jozkee
jozkee merged commit 96f9c41 into dotnet:release/11.0-preview6Jun 25, 2026
149 of 157 checks passed
@dotnet-milestone-botdotnet-milestone-botBot added this to the 11.0-preview6 milestone Jun 25, 2026
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jul 25, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-System.MemoryServicing-approvedApproved for servicing release

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@ViveliDuCh@jozkee@jeffhandley
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

[release/11.0-preview6] Add Stream wrappers for memory and text-based types - #129811

Merged
jozkee merged 1 commit into
dotnet:release/11.0-preview6from
ViveliDuCh:backport-pr-126669
Jun 25, 2026
Merged

[release/11.0-preview6] Add Stream wrappers for memory and text-based types#129811
jozkee merged 1 commit into
dotnet:release/11.0-preview6from
ViveliDuCh:backport-pr-126669

Conversation

@ViveliDuCh

Copy link
Copy Markdown
Member

Backport of #126669 to release/11.0-preview6. See that PR for full details.

Adds new public stream wrapper APIs (StringStream, ReadOnlyMemoryStream, WritableMemoryStream, ReadOnlySequenceStream).

Fixes#82801.

Fixesdotnet#82801
Introduces standardized stream wrappers for text and memory types as
public sealed classes (`StringStream`, `ReadOnlyMemoryStream`,
`WritableMemoryStream`, and `ReadOnlySequenceStream` ) as approved in
[API
review](dotnet#82801 (comment))
([video](https://www.youtube.com/watch?v=T7xc7rARCEw&t=0h9m41s)).
### What's included
- `StringStream` (`System.IO`, CoreLib): non-seekable, read-only stream
that encodes `string` or `ReadOnlyMemory<char>` on-the-fly. Encoding is
required (no default). Never emits BOMs.
- `ReadOnlyMemoryStream` (`System.IO`, CoreLib): seekable, read-only
stream over `ReadOnlyMemory<byte>`
- `WritableMemoryStream` (`System.IO`, CoreLib): seekable, read-write
stream over `Memory<byte>` with fixed capacity
- `ReadOnlySequenceStream` (`System.Buffers`, System.Memory): seekable,
read-only stream over `ReadOnlySequence<byte>`
- Ref assembly updates for `System.Runtime` and `System.Memory`
- Updated 3 internal call sites (`ReadOnlyMemoryContent`,
`XmlPreloadedResolver`, `JsonXmlDataContract`) to use the new types
- Conformance and behavioral tests for all 4 types
### Implementation notes
- All types are `public sealed` with direct constructors: the review
moved away from factory methods on `Stream` to avoid derived-type
IntelliSense noise
- `StringStream` encodes directly into the caller's buffer in `Read()`
rather than using an internal byte buffer
- `ReadOnlyMemoryStream` and `WritableMemoryStream` derive from
`MemoryStream`.
- `TryGetBuffer` returns false and `GetBuffer` throws on the memory
stream types (no `publiclyVisible` support for now)
### Limitations
- The internal
[shared-source](https://github.com/dotnet/runtime/blob/main/src/libraries/Common/src/System/IO/ReadOnlyMemoryStream.cs)
`ReadOnlyMemoryStream` in `Common/` cannot be fully replaced:
- `System.Memory.Data` multi-targets `netstandard2.0` where the new
public type doesn't exist.
- `System.Net.Http` (net11.0 only) can adopt it directly.
### Follow-up work
- `IBufferWriter<byte>` → `Stream` wrapper (separate proposal per
[dotnet#100434](dotnet#100434))
---------
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@ViveliDuChViveliDuCh self-assigned this Jun 24, 2026
CopilotAI review requested due to automatic review settings June 24, 2026 17:44
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @dotnet/area-system-memory
See info in area-owners.md if you want to be subscribed.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This backport introduces new public stream wrapper types for text and memory-backed data (StringStream, ReadOnlyMemoryStream, WritableMemoryStream, ReadOnlySequenceStream) and wires them into the appropriate libraries (CoreLib / System.Runtime and System.Memory), along with conformance + behavioral tests and a few call-site updates to use the new APIs.

Changes:

  • Added new public stream wrapper implementations in CoreLib (System.IO) and System.Memory (System.Buffers), plus updated ref assemblies.
  • Added conformance/behavioral tests for the new stream wrappers.
  • Updated call sites and shared-source usage (including removing the internal Common ReadOnlyMemoryStream for net11.0+ and updating System.Net.Http to use the public type).

Reviewed changes

Copilot reviewed 28 out of 29 changed files in this pull request and generated no comments.

Show a summary per file
FileDescription
src/libraries/System.Private.CoreLib/src/System/IO/StringStream.csImplements StringStream (read-only, non-seekable, on-the-fly encoding).
src/libraries/System.Private.CoreLib/src/System/IO/ReadOnlyMemoryStream.csImplements ReadOnlyMemoryStream over ReadOnlyMemory<byte>.
src/libraries/System.Private.CoreLib/src/System/IO/WritableMemoryStream.csImplements WritableMemoryStream over Memory<byte> with fixed capacity.
src/libraries/System.Private.CoreLib/src/System/IO/MemoryStream.csExposes selected MemoryStream fields as private protected to support in-assembly derived wrappers.
src/libraries/System.Private.CoreLib/src/System.Private.CoreLib.Shared.projitemsIncludes new CoreLib stream wrapper sources; switches CachedCompletedInt32Task to Common-linked source.
src/libraries/System.Runtime/ref/System.Runtime.csAdds ref-surface for StringStream, ReadOnlyMemoryStream, WritableMemoryStream.
src/libraries/System.Runtime/tests/System.IO.Tests/System.IO.Tests.csprojIncludes new test files for the added stream wrapper types.
src/libraries/System.Runtime/tests/System.IO.Tests/StringStream/StringStreamTestBase.csShared test harness for validating StringStream behaviors across read APIs.
src/libraries/System.Runtime/tests/System.IO.Tests/StringStream/StringStreamTests_String.csStringStream(string, Encoding) tests across sync/async read APIs and misc behaviors.
src/libraries/System.Runtime/tests/System.IO.Tests/StringStream/StringStreamTests_Memory.csStringStream(ReadOnlyMemory<char>, Encoding) tests including slicing and surrogate edge cases.
src/libraries/System.Runtime/tests/System.IO.Tests/StringStream/StringStreamConformanceTests.csConformance test coverage for StringStream using an identity encoding for arbitrary bytes.
src/libraries/System.Runtime/tests/System.IO.Tests/ReadOnlyMemoryStream/ReadOnlyMemoryStreamTests.csBehavioral tests for ReadOnlyMemoryStream.
src/libraries/System.Runtime/tests/System.IO.Tests/ReadOnlyMemoryStream/ReadOnlyMemoryStreamConformanceTests.csStream conformance coverage for ReadOnlyMemoryStream.
src/libraries/System.Runtime/tests/System.IO.Tests/WritableMemoryStream/WritableMemoryStreamTests.csBehavioral tests for WritableMemoryStream, especially capacity semantics.
src/libraries/System.Runtime/tests/System.IO.Tests/WritableMemoryStream/WritableMemoryStreamConformanceTests.csStream conformance coverage for WritableMemoryStream.
src/libraries/System.Memory/src/System/Buffers/ReadOnlySequenceStream.csImplements ReadOnlySequenceStream over ReadOnlySequence<byte>.
src/libraries/System.Memory/src/System.Memory.csprojIncludes ReadOnlySequenceStream and links CachedCompletedInt32Task from Common.
src/libraries/System.Memory/src/Resources/Strings.resxAdds SR strings needed for ReadOnlySequenceStream exceptions.
src/libraries/System.Memory/ref/System.Memory.csAdds ref-surface for ReadOnlySequenceStream.
src/libraries/System.Memory/tests/System.Memory.Tests.csprojAdds conformance test sources and references StreamConformanceTests for the new stream wrapper.
src/libraries/System.Memory/tests/ReadOnlyBuffer/ReadOnlySequenceStream.ConformanceTests.csConformance coverage for ReadOnlySequenceStream across single/multi/fragmented sequences.
src/libraries/System.Memory/tests/ReadOnlyBuffer/NativeMemoryOwningStream.csTest helper to own/dispose unmanaged buffers used by native-memory conformance tests.
src/libraries/System.Memory/tests/ReadOnlyBuffer/NativeReadOnlyMemoryStream.ConformanceTests.csConformance coverage for ReadOnlyMemoryStream over unmanaged-backed memory.
src/libraries/System.Memory/tests/ReadOnlyBuffer/NativeWritableMemoryStream.ConformanceTests.csConformance coverage for WritableMemoryStream over unmanaged-backed memory.
src/libraries/System.Memory.Data/tests/BinaryDataTests.csAdjusts exception expectations to align with updated seek/OD behavior.
src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/Json/JsonXmlDataContract.csUses StringStream instead of allocating a UTF-8 byte[] + MemoryStream.
src/libraries/System.Net.Http/src/System.Net.Http.csprojStops linking the internal Common ReadOnlyMemoryStream (uses public CoreLib type for net11+).
src/libraries/Common/src/System/IO/ReadOnlyMemoryStream.csExcludes internal Common ReadOnlyMemoryStream on net11.0+ (public CoreLib type supersedes it).
src/libraries/Common/src/System/Threading/Tasks/CachedCompletedInt32Task.csIntroduces Common-linked cached task helper used by stream implementations.

@jozkeejozkee added the Servicing-approved Approved for servicing release label Jun 24, 2026

@jeffhandleyjeffhandley left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Great to get this into Preview 6. Has my support!

@jozkee

Copy link
Copy Markdown
Member

/ba-g known errors only and 2 legs show as unfinished but they are cancelled.

@jozkee
jozkee merged commit 96f9c41 into dotnet:release/11.0-preview6Jun 25, 2026
149 of 157 checks passed
@dotnet-milestone-botdotnet-milestone-botBot added this to the 11.0-preview6 milestone Jun 25, 2026
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jul 25, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-System.MemoryServicing-approvedApproved for servicing release

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@ViveliDuCh@jozkee@jeffhandley
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

[release/11.0-preview6] Add Stream wrappers for memory and text-based types - #129811

Merged
jozkee merged 1 commit into
dotnet:release/11.0-preview6from
ViveliDuCh:backport-pr-126669
Jun 25, 2026
Merged

[release/11.0-preview6] Add Stream wrappers for memory and text-based types#129811
jozkee merged 1 commit into
dotnet:release/11.0-preview6from
ViveliDuCh:backport-pr-126669

Conversation

@ViveliDuCh

Copy link
Copy Markdown
Member

Backport of #126669 to release/11.0-preview6. See that PR for full details.

Adds new public stream wrapper APIs (StringStream, ReadOnlyMemoryStream, WritableMemoryStream, ReadOnlySequenceStream).

Fixes#82801.

Fixesdotnet#82801
Introduces standardized stream wrappers for text and memory types as
public sealed classes (`StringStream`, `ReadOnlyMemoryStream`,
`WritableMemoryStream`, and `ReadOnlySequenceStream` ) as approved in
[API
review](dotnet#82801 (comment))
([video](https://www.youtube.com/watch?v=T7xc7rARCEw&t=0h9m41s)).
### What's included
- `StringStream` (`System.IO`, CoreLib): non-seekable, read-only stream
that encodes `string` or `ReadOnlyMemory<char>` on-the-fly. Encoding is
required (no default). Never emits BOMs.
- `ReadOnlyMemoryStream` (`System.IO`, CoreLib): seekable, read-only
stream over `ReadOnlyMemory<byte>`
- `WritableMemoryStream` (`System.IO`, CoreLib): seekable, read-write
stream over `Memory<byte>` with fixed capacity
- `ReadOnlySequenceStream` (`System.Buffers`, System.Memory): seekable,
read-only stream over `ReadOnlySequence<byte>`
- Ref assembly updates for `System.Runtime` and `System.Memory`
- Updated 3 internal call sites (`ReadOnlyMemoryContent`,
`XmlPreloadedResolver`, `JsonXmlDataContract`) to use the new types
- Conformance and behavioral tests for all 4 types
### Implementation notes
- All types are `public sealed` with direct constructors: the review
moved away from factory methods on `Stream` to avoid derived-type
IntelliSense noise
- `StringStream` encodes directly into the caller's buffer in `Read()`
rather than using an internal byte buffer
- `ReadOnlyMemoryStream` and `WritableMemoryStream` derive from
`MemoryStream`.
- `TryGetBuffer` returns false and `GetBuffer` throws on the memory
stream types (no `publiclyVisible` support for now)
### Limitations
- The internal
[shared-source](https://github.com/dotnet/runtime/blob/main/src/libraries/Common/src/System/IO/ReadOnlyMemoryStream.cs)
`ReadOnlyMemoryStream` in `Common/` cannot be fully replaced:
- `System.Memory.Data` multi-targets `netstandard2.0` where the new
public type doesn't exist.
- `System.Net.Http` (net11.0 only) can adopt it directly.
### Follow-up work
- `IBufferWriter<byte>` → `Stream` wrapper (separate proposal per
[dotnet#100434](dotnet#100434))
---------
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@ViveliDuChViveliDuCh self-assigned this Jun 24, 2026
CopilotAI review requested due to automatic review settings June 24, 2026 17:44
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @dotnet/area-system-memory
See info in area-owners.md if you want to be subscribed.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This backport introduces new public stream wrapper types for text and memory-backed data (StringStream, ReadOnlyMemoryStream, WritableMemoryStream, ReadOnlySequenceStream) and wires them into the appropriate libraries (CoreLib / System.Runtime and System.Memory), along with conformance + behavioral tests and a few call-site updates to use the new APIs.

Changes:

  • Added new public stream wrapper implementations in CoreLib (System.IO) and System.Memory (System.Buffers), plus updated ref assemblies.
  • Added conformance/behavioral tests for the new stream wrappers.
  • Updated call sites and shared-source usage (including removing the internal Common ReadOnlyMemoryStream for net11.0+ and updating System.Net.Http to use the public type).

Reviewed changes

Copilot reviewed 28 out of 29 changed files in this pull request and generated no comments.

Show a summary per file
FileDescription
src/libraries/System.Private.CoreLib/src/System/IO/StringStream.csImplements StringStream (read-only, non-seekable, on-the-fly encoding).
src/libraries/System.Private.CoreLib/src/System/IO/ReadOnlyMemoryStream.csImplements ReadOnlyMemoryStream over ReadOnlyMemory<byte>.
src/libraries/System.Private.CoreLib/src/System/IO/WritableMemoryStream.csImplements WritableMemoryStream over Memory<byte> with fixed capacity.
src/libraries/System.Private.CoreLib/src/System/IO/MemoryStream.csExposes selected MemoryStream fields as private protected to support in-assembly derived wrappers.
src/libraries/System.Private.CoreLib/src/System.Private.CoreLib.Shared.projitemsIncludes new CoreLib stream wrapper sources; switches CachedCompletedInt32Task to Common-linked source.
src/libraries/System.Runtime/ref/System.Runtime.csAdds ref-surface for StringStream, ReadOnlyMemoryStream, WritableMemoryStream.
src/libraries/System.Runtime/tests/System.IO.Tests/System.IO.Tests.csprojIncludes new test files for the added stream wrapper types.
src/libraries/System.Runtime/tests/System.IO.Tests/StringStream/StringStreamTestBase.csShared test harness for validating StringStream behaviors across read APIs.
src/libraries/System.Runtime/tests/System.IO.Tests/StringStream/StringStreamTests_String.csStringStream(string, Encoding) tests across sync/async read APIs and misc behaviors.
src/libraries/System.Runtime/tests/System.IO.Tests/StringStream/StringStreamTests_Memory.csStringStream(ReadOnlyMemory<char>, Encoding) tests including slicing and surrogate edge cases.
src/libraries/System.Runtime/tests/System.IO.Tests/StringStream/StringStreamConformanceTests.csConformance test coverage for StringStream using an identity encoding for arbitrary bytes.
src/libraries/System.Runtime/tests/System.IO.Tests/ReadOnlyMemoryStream/ReadOnlyMemoryStreamTests.csBehavioral tests for ReadOnlyMemoryStream.
src/libraries/System.Runtime/tests/System.IO.Tests/ReadOnlyMemoryStream/ReadOnlyMemoryStreamConformanceTests.csStream conformance coverage for ReadOnlyMemoryStream.
src/libraries/System.Runtime/tests/System.IO.Tests/WritableMemoryStream/WritableMemoryStreamTests.csBehavioral tests for WritableMemoryStream, especially capacity semantics.
src/libraries/System.Runtime/tests/System.IO.Tests/WritableMemoryStream/WritableMemoryStreamConformanceTests.csStream conformance coverage for WritableMemoryStream.
src/libraries/System.Memory/src/System/Buffers/ReadOnlySequenceStream.csImplements ReadOnlySequenceStream over ReadOnlySequence<byte>.
src/libraries/System.Memory/src/System.Memory.csprojIncludes ReadOnlySequenceStream and links CachedCompletedInt32Task from Common.
src/libraries/System.Memory/src/Resources/Strings.resxAdds SR strings needed for ReadOnlySequenceStream exceptions.
src/libraries/System.Memory/ref/System.Memory.csAdds ref-surface for ReadOnlySequenceStream.
src/libraries/System.Memory/tests/System.Memory.Tests.csprojAdds conformance test sources and references StreamConformanceTests for the new stream wrapper.
src/libraries/System.Memory/tests/ReadOnlyBuffer/ReadOnlySequenceStream.ConformanceTests.csConformance coverage for ReadOnlySequenceStream across single/multi/fragmented sequences.
src/libraries/System.Memory/tests/ReadOnlyBuffer/NativeMemoryOwningStream.csTest helper to own/dispose unmanaged buffers used by native-memory conformance tests.
src/libraries/System.Memory/tests/ReadOnlyBuffer/NativeReadOnlyMemoryStream.ConformanceTests.csConformance coverage for ReadOnlyMemoryStream over unmanaged-backed memory.
src/libraries/System.Memory/tests/ReadOnlyBuffer/NativeWritableMemoryStream.ConformanceTests.csConformance coverage for WritableMemoryStream over unmanaged-backed memory.
src/libraries/System.Memory.Data/tests/BinaryDataTests.csAdjusts exception expectations to align with updated seek/OD behavior.
src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/Json/JsonXmlDataContract.csUses StringStream instead of allocating a UTF-8 byte[] + MemoryStream.
src/libraries/System.Net.Http/src/System.Net.Http.csprojStops linking the internal Common ReadOnlyMemoryStream (uses public CoreLib type for net11+).
src/libraries/Common/src/System/IO/ReadOnlyMemoryStream.csExcludes internal Common ReadOnlyMemoryStream on net11.0+ (public CoreLib type supersedes it).
src/libraries/Common/src/System/Threading/Tasks/CachedCompletedInt32Task.csIntroduces Common-linked cached task helper used by stream implementations.

@jozkeejozkee added the Servicing-approved Approved for servicing release label Jun 24, 2026

@jeffhandleyjeffhandley left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Great to get this into Preview 6. Has my support!

@jozkee

Copy link
Copy Markdown
Member

/ba-g known errors only and 2 legs show as unfinished but they are cancelled.

@jozkee
jozkee merged commit 96f9c41 into dotnet:release/11.0-preview6Jun 25, 2026
149 of 157 checks passed
@dotnet-milestone-botdotnet-milestone-botBot added this to the 11.0-preview6 milestone Jun 25, 2026
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jul 25, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-System.MemoryServicing-approvedApproved for servicing release

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@ViveliDuCh@jozkee@jeffhandley
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

[release/11.0-preview6] Add Stream wrappers for memory and text-based types - #129811

Merged
jozkee merged 1 commit into
dotnet:release/11.0-preview6from
ViveliDuCh:backport-pr-126669
Jun 25, 2026
Merged

[release/11.0-preview6] Add Stream wrappers for memory and text-based types#129811
jozkee merged 1 commit into
dotnet:release/11.0-preview6from
ViveliDuCh:backport-pr-126669

Conversation

@ViveliDuCh

Copy link
Copy Markdown
Member

Backport of #126669 to release/11.0-preview6. See that PR for full details.

Adds new public stream wrapper APIs (StringStream, ReadOnlyMemoryStream, WritableMemoryStream, ReadOnlySequenceStream).

Fixes#82801.

Fixesdotnet#82801
Introduces standardized stream wrappers for text and memory types as
public sealed classes (`StringStream`, `ReadOnlyMemoryStream`,
`WritableMemoryStream`, and `ReadOnlySequenceStream` ) as approved in
[API
review](dotnet#82801 (comment))
([video](https://www.youtube.com/watch?v=T7xc7rARCEw&t=0h9m41s)).
### What's included
- `StringStream` (`System.IO`, CoreLib): non-seekable, read-only stream
that encodes `string` or `ReadOnlyMemory<char>` on-the-fly. Encoding is
required (no default). Never emits BOMs.
- `ReadOnlyMemoryStream` (`System.IO`, CoreLib): seekable, read-only
stream over `ReadOnlyMemory<byte>`
- `WritableMemoryStream` (`System.IO`, CoreLib): seekable, read-write
stream over `Memory<byte>` with fixed capacity
- `ReadOnlySequenceStream` (`System.Buffers`, System.Memory): seekable,
read-only stream over `ReadOnlySequence<byte>`
- Ref assembly updates for `System.Runtime` and `System.Memory`
- Updated 3 internal call sites (`ReadOnlyMemoryContent`,
`XmlPreloadedResolver`, `JsonXmlDataContract`) to use the new types
- Conformance and behavioral tests for all 4 types
### Implementation notes
- All types are `public sealed` with direct constructors: the review
moved away from factory methods on `Stream` to avoid derived-type
IntelliSense noise
- `StringStream` encodes directly into the caller's buffer in `Read()`
rather than using an internal byte buffer
- `ReadOnlyMemoryStream` and `WritableMemoryStream` derive from
`MemoryStream`.
- `TryGetBuffer` returns false and `GetBuffer` throws on the memory
stream types (no `publiclyVisible` support for now)
### Limitations
- The internal
[shared-source](https://github.com/dotnet/runtime/blob/main/src/libraries/Common/src/System/IO/ReadOnlyMemoryStream.cs)
`ReadOnlyMemoryStream` in `Common/` cannot be fully replaced:
- `System.Memory.Data` multi-targets `netstandard2.0` where the new
public type doesn't exist.
- `System.Net.Http` (net11.0 only) can adopt it directly.
### Follow-up work
- `IBufferWriter<byte>` → `Stream` wrapper (separate proposal per
[dotnet#100434](dotnet#100434))
---------
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@ViveliDuChViveliDuCh self-assigned this Jun 24, 2026
CopilotAI review requested due to automatic review settings June 24, 2026 17:44
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @dotnet/area-system-memory
See info in area-owners.md if you want to be subscribed.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This backport introduces new public stream wrapper types for text and memory-backed data (StringStream, ReadOnlyMemoryStream, WritableMemoryStream, ReadOnlySequenceStream) and wires them into the appropriate libraries (CoreLib / System.Runtime and System.Memory), along with conformance + behavioral tests and a few call-site updates to use the new APIs.

Changes:

  • Added new public stream wrapper implementations in CoreLib (System.IO) and System.Memory (System.Buffers), plus updated ref assemblies.
  • Added conformance/behavioral tests for the new stream wrappers.
  • Updated call sites and shared-source usage (including removing the internal Common ReadOnlyMemoryStream for net11.0+ and updating System.Net.Http to use the public type).

Reviewed changes

Copilot reviewed 28 out of 29 changed files in this pull request and generated no comments.

Show a summary per file
FileDescription
src/libraries/System.Private.CoreLib/src/System/IO/StringStream.csImplements StringStream (read-only, non-seekable, on-the-fly encoding).
src/libraries/System.Private.CoreLib/src/System/IO/ReadOnlyMemoryStream.csImplements ReadOnlyMemoryStream over ReadOnlyMemory<byte>.
src/libraries/System.Private.CoreLib/src/System/IO/WritableMemoryStream.csImplements WritableMemoryStream over Memory<byte> with fixed capacity.
src/libraries/System.Private.CoreLib/src/System/IO/MemoryStream.csExposes selected MemoryStream fields as private protected to support in-assembly derived wrappers.
src/libraries/System.Private.CoreLib/src/System.Private.CoreLib.Shared.projitemsIncludes new CoreLib stream wrapper sources; switches CachedCompletedInt32Task to Common-linked source.
src/libraries/System.Runtime/ref/System.Runtime.csAdds ref-surface for StringStream, ReadOnlyMemoryStream, WritableMemoryStream.
src/libraries/System.Runtime/tests/System.IO.Tests/System.IO.Tests.csprojIncludes new test files for the added stream wrapper types.
src/libraries/System.Runtime/tests/System.IO.Tests/StringStream/StringStreamTestBase.csShared test harness for validating StringStream behaviors across read APIs.
src/libraries/System.Runtime/tests/System.IO.Tests/StringStream/StringStreamTests_String.csStringStream(string, Encoding) tests across sync/async read APIs and misc behaviors.
src/libraries/System.Runtime/tests/System.IO.Tests/StringStream/StringStreamTests_Memory.csStringStream(ReadOnlyMemory<char>, Encoding) tests including slicing and surrogate edge cases.
src/libraries/System.Runtime/tests/System.IO.Tests/StringStream/StringStreamConformanceTests.csConformance test coverage for StringStream using an identity encoding for arbitrary bytes.
src/libraries/System.Runtime/tests/System.IO.Tests/ReadOnlyMemoryStream/ReadOnlyMemoryStreamTests.csBehavioral tests for ReadOnlyMemoryStream.
src/libraries/System.Runtime/tests/System.IO.Tests/ReadOnlyMemoryStream/ReadOnlyMemoryStreamConformanceTests.csStream conformance coverage for ReadOnlyMemoryStream.
src/libraries/System.Runtime/tests/System.IO.Tests/WritableMemoryStream/WritableMemoryStreamTests.csBehavioral tests for WritableMemoryStream, especially capacity semantics.
src/libraries/System.Runtime/tests/System.IO.Tests/WritableMemoryStream/WritableMemoryStreamConformanceTests.csStream conformance coverage for WritableMemoryStream.
src/libraries/System.Memory/src/System/Buffers/ReadOnlySequenceStream.csImplements ReadOnlySequenceStream over ReadOnlySequence<byte>.
src/libraries/System.Memory/src/System.Memory.csprojIncludes ReadOnlySequenceStream and links CachedCompletedInt32Task from Common.
src/libraries/System.Memory/src/Resources/Strings.resxAdds SR strings needed for ReadOnlySequenceStream exceptions.
src/libraries/System.Memory/ref/System.Memory.csAdds ref-surface for ReadOnlySequenceStream.
src/libraries/System.Memory/tests/System.Memory.Tests.csprojAdds conformance test sources and references StreamConformanceTests for the new stream wrapper.
src/libraries/System.Memory/tests/ReadOnlyBuffer/ReadOnlySequenceStream.ConformanceTests.csConformance coverage for ReadOnlySequenceStream across single/multi/fragmented sequences.
src/libraries/System.Memory/tests/ReadOnlyBuffer/NativeMemoryOwningStream.csTest helper to own/dispose unmanaged buffers used by native-memory conformance tests.
src/libraries/System.Memory/tests/ReadOnlyBuffer/NativeReadOnlyMemoryStream.ConformanceTests.csConformance coverage for ReadOnlyMemoryStream over unmanaged-backed memory.
src/libraries/System.Memory/tests/ReadOnlyBuffer/NativeWritableMemoryStream.ConformanceTests.csConformance coverage for WritableMemoryStream over unmanaged-backed memory.
src/libraries/System.Memory.Data/tests/BinaryDataTests.csAdjusts exception expectations to align with updated seek/OD behavior.
src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/Json/JsonXmlDataContract.csUses StringStream instead of allocating a UTF-8 byte[] + MemoryStream.
src/libraries/System.Net.Http/src/System.Net.Http.csprojStops linking the internal Common ReadOnlyMemoryStream (uses public CoreLib type for net11+).
src/libraries/Common/src/System/IO/ReadOnlyMemoryStream.csExcludes internal Common ReadOnlyMemoryStream on net11.0+ (public CoreLib type supersedes it).
src/libraries/Common/src/System/Threading/Tasks/CachedCompletedInt32Task.csIntroduces Common-linked cached task helper used by stream implementations.

@jozkeejozkee added the Servicing-approved Approved for servicing release label Jun 24, 2026

@jeffhandleyjeffhandley left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Great to get this into Preview 6. Has my support!

@jozkee

Copy link
Copy Markdown
Member

/ba-g known errors only and 2 legs show as unfinished but they are cancelled.

@jozkee
jozkee merged commit 96f9c41 into dotnet:release/11.0-preview6Jun 25, 2026
149 of 157 checks passed
@dotnet-milestone-botdotnet-milestone-botBot added this to the 11.0-preview6 milestone Jun 25, 2026
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jul 25, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-System.MemoryServicing-approvedApproved for servicing release

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@ViveliDuCh@jozkee@jeffhandley
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

[release/11.0-preview6] Add Stream wrappers for memory and text-based types - #129811

Merged
jozkee merged 1 commit into
dotnet:release/11.0-preview6from
ViveliDuCh:backport-pr-126669
Jun 25, 2026
Merged

[release/11.0-preview6] Add Stream wrappers for memory and text-based types#129811
jozkee merged 1 commit into
dotnet:release/11.0-preview6from
ViveliDuCh:backport-pr-126669

Conversation

@ViveliDuCh

Copy link
Copy Markdown
Member

Backport of #126669 to release/11.0-preview6. See that PR for full details.

Adds new public stream wrapper APIs (StringStream, ReadOnlyMemoryStream, WritableMemoryStream, ReadOnlySequenceStream).

Fixes#82801.

Fixesdotnet#82801
Introduces standardized stream wrappers for text and memory types as
public sealed classes (`StringStream`, `ReadOnlyMemoryStream`,
`WritableMemoryStream`, and `ReadOnlySequenceStream` ) as approved in
[API
review](dotnet#82801 (comment))
([video](https://www.youtube.com/watch?v=T7xc7rARCEw&t=0h9m41s)).
### What's included
- `StringStream` (`System.IO`, CoreLib): non-seekable, read-only stream
that encodes `string` or `ReadOnlyMemory<char>` on-the-fly. Encoding is
required (no default). Never emits BOMs.
- `ReadOnlyMemoryStream` (`System.IO`, CoreLib): seekable, read-only
stream over `ReadOnlyMemory<byte>`
- `WritableMemoryStream` (`System.IO`, CoreLib): seekable, read-write
stream over `Memory<byte>` with fixed capacity
- `ReadOnlySequenceStream` (`System.Buffers`, System.Memory): seekable,
read-only stream over `ReadOnlySequence<byte>`
- Ref assembly updates for `System.Runtime` and `System.Memory`
- Updated 3 internal call sites (`ReadOnlyMemoryContent`,
`XmlPreloadedResolver`, `JsonXmlDataContract`) to use the new types
- Conformance and behavioral tests for all 4 types
### Implementation notes
- All types are `public sealed` with direct constructors: the review
moved away from factory methods on `Stream` to avoid derived-type
IntelliSense noise
- `StringStream` encodes directly into the caller's buffer in `Read()`
rather than using an internal byte buffer
- `ReadOnlyMemoryStream` and `WritableMemoryStream` derive from
`MemoryStream`.
- `TryGetBuffer` returns false and `GetBuffer` throws on the memory
stream types (no `publiclyVisible` support for now)
### Limitations
- The internal
[shared-source](https://github.com/dotnet/runtime/blob/main/src/libraries/Common/src/System/IO/ReadOnlyMemoryStream.cs)
`ReadOnlyMemoryStream` in `Common/` cannot be fully replaced:
- `System.Memory.Data` multi-targets `netstandard2.0` where the new
public type doesn't exist.
- `System.Net.Http` (net11.0 only) can adopt it directly.
### Follow-up work
- `IBufferWriter<byte>` → `Stream` wrapper (separate proposal per
[dotnet#100434](dotnet#100434))
---------
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@ViveliDuChViveliDuCh self-assigned this Jun 24, 2026
CopilotAI review requested due to automatic review settings June 24, 2026 17:44
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @dotnet/area-system-memory
See info in area-owners.md if you want to be subscribed.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This backport introduces new public stream wrapper types for text and memory-backed data (StringStream, ReadOnlyMemoryStream, WritableMemoryStream, ReadOnlySequenceStream) and wires them into the appropriate libraries (CoreLib / System.Runtime and System.Memory), along with conformance + behavioral tests and a few call-site updates to use the new APIs.

Changes:

  • Added new public stream wrapper implementations in CoreLib (System.IO) and System.Memory (System.Buffers), plus updated ref assemblies.
  • Added conformance/behavioral tests for the new stream wrappers.
  • Updated call sites and shared-source usage (including removing the internal Common ReadOnlyMemoryStream for net11.0+ and updating System.Net.Http to use the public type).

Reviewed changes

Copilot reviewed 28 out of 29 changed files in this pull request and generated no comments.

Show a summary per file
FileDescription
src/libraries/System.Private.CoreLib/src/System/IO/StringStream.csImplements StringStream (read-only, non-seekable, on-the-fly encoding).
src/libraries/System.Private.CoreLib/src/System/IO/ReadOnlyMemoryStream.csImplements ReadOnlyMemoryStream over ReadOnlyMemory<byte>.
src/libraries/System.Private.CoreLib/src/System/IO/WritableMemoryStream.csImplements WritableMemoryStream over Memory<byte> with fixed capacity.
src/libraries/System.Private.CoreLib/src/System/IO/MemoryStream.csExposes selected MemoryStream fields as private protected to support in-assembly derived wrappers.
src/libraries/System.Private.CoreLib/src/System.Private.CoreLib.Shared.projitemsIncludes new CoreLib stream wrapper sources; switches CachedCompletedInt32Task to Common-linked source.
src/libraries/System.Runtime/ref/System.Runtime.csAdds ref-surface for StringStream, ReadOnlyMemoryStream, WritableMemoryStream.
src/libraries/System.Runtime/tests/System.IO.Tests/System.IO.Tests.csprojIncludes new test files for the added stream wrapper types.
src/libraries/System.Runtime/tests/System.IO.Tests/StringStream/StringStreamTestBase.csShared test harness for validating StringStream behaviors across read APIs.
src/libraries/System.Runtime/tests/System.IO.Tests/StringStream/StringStreamTests_String.csStringStream(string, Encoding) tests across sync/async read APIs and misc behaviors.
src/libraries/System.Runtime/tests/System.IO.Tests/StringStream/StringStreamTests_Memory.csStringStream(ReadOnlyMemory<char>, Encoding) tests including slicing and surrogate edge cases.
src/libraries/System.Runtime/tests/System.IO.Tests/StringStream/StringStreamConformanceTests.csConformance test coverage for StringStream using an identity encoding for arbitrary bytes.
src/libraries/System.Runtime/tests/System.IO.Tests/ReadOnlyMemoryStream/ReadOnlyMemoryStreamTests.csBehavioral tests for ReadOnlyMemoryStream.
src/libraries/System.Runtime/tests/System.IO.Tests/ReadOnlyMemoryStream/ReadOnlyMemoryStreamConformanceTests.csStream conformance coverage for ReadOnlyMemoryStream.
src/libraries/System.Runtime/tests/System.IO.Tests/WritableMemoryStream/WritableMemoryStreamTests.csBehavioral tests for WritableMemoryStream, especially capacity semantics.
src/libraries/System.Runtime/tests/System.IO.Tests/WritableMemoryStream/WritableMemoryStreamConformanceTests.csStream conformance coverage for WritableMemoryStream.
src/libraries/System.Memory/src/System/Buffers/ReadOnlySequenceStream.csImplements ReadOnlySequenceStream over ReadOnlySequence<byte>.
src/libraries/System.Memory/src/System.Memory.csprojIncludes ReadOnlySequenceStream and links CachedCompletedInt32Task from Common.
src/libraries/System.Memory/src/Resources/Strings.resxAdds SR strings needed for ReadOnlySequenceStream exceptions.
src/libraries/System.Memory/ref/System.Memory.csAdds ref-surface for ReadOnlySequenceStream.
src/libraries/System.Memory/tests/System.Memory.Tests.csprojAdds conformance test sources and references StreamConformanceTests for the new stream wrapper.
src/libraries/System.Memory/tests/ReadOnlyBuffer/ReadOnlySequenceStream.ConformanceTests.csConformance coverage for ReadOnlySequenceStream across single/multi/fragmented sequences.
src/libraries/System.Memory/tests/ReadOnlyBuffer/NativeMemoryOwningStream.csTest helper to own/dispose unmanaged buffers used by native-memory conformance tests.
src/libraries/System.Memory/tests/ReadOnlyBuffer/NativeReadOnlyMemoryStream.ConformanceTests.csConformance coverage for ReadOnlyMemoryStream over unmanaged-backed memory.
src/libraries/System.Memory/tests/ReadOnlyBuffer/NativeWritableMemoryStream.ConformanceTests.csConformance coverage for WritableMemoryStream over unmanaged-backed memory.
src/libraries/System.Memory.Data/tests/BinaryDataTests.csAdjusts exception expectations to align with updated seek/OD behavior.
src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/Json/JsonXmlDataContract.csUses StringStream instead of allocating a UTF-8 byte[] + MemoryStream.
src/libraries/System.Net.Http/src/System.Net.Http.csprojStops linking the internal Common ReadOnlyMemoryStream (uses public CoreLib type for net11+).
src/libraries/Common/src/System/IO/ReadOnlyMemoryStream.csExcludes internal Common ReadOnlyMemoryStream on net11.0+ (public CoreLib type supersedes it).
src/libraries/Common/src/System/Threading/Tasks/CachedCompletedInt32Task.csIntroduces Common-linked cached task helper used by stream implementations.

@jozkeejozkee added the Servicing-approved Approved for servicing release label Jun 24, 2026

@jeffhandleyjeffhandley left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Great to get this into Preview 6. Has my support!

@jozkee

Copy link
Copy Markdown
Member

/ba-g known errors only and 2 legs show as unfinished but they are cancelled.

@jozkee
jozkee merged commit 96f9c41 into dotnet:release/11.0-preview6Jun 25, 2026
149 of 157 checks passed
@dotnet-milestone-botdotnet-milestone-botBot added this to the 11.0-preview6 milestone Jun 25, 2026
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jul 25, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-System.MemoryServicing-approvedApproved for servicing release

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@ViveliDuCh@jozkee@jeffhandley
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

[release/11.0-preview6] Add Stream wrappers for memory and text-based types - #129811

Merged
jozkee merged 1 commit into
dotnet:release/11.0-preview6from
ViveliDuCh:backport-pr-126669
Jun 25, 2026
Merged

[release/11.0-preview6] Add Stream wrappers for memory and text-based types#129811
jozkee merged 1 commit into
dotnet:release/11.0-preview6from
ViveliDuCh:backport-pr-126669

Conversation

@ViveliDuCh

Copy link
Copy Markdown
Member

Backport of #126669 to release/11.0-preview6. See that PR for full details.

Adds new public stream wrapper APIs (StringStream, ReadOnlyMemoryStream, WritableMemoryStream, ReadOnlySequenceStream).

Fixes#82801.

Fixesdotnet#82801
Introduces standardized stream wrappers for text and memory types as
public sealed classes (`StringStream`, `ReadOnlyMemoryStream`,
`WritableMemoryStream`, and `ReadOnlySequenceStream` ) as approved in
[API
review](dotnet#82801 (comment))
([video](https://www.youtube.com/watch?v=T7xc7rARCEw&t=0h9m41s)).
### What's included
- `StringStream` (`System.IO`, CoreLib): non-seekable, read-only stream
that encodes `string` or `ReadOnlyMemory<char>` on-the-fly. Encoding is
required (no default). Never emits BOMs.
- `ReadOnlyMemoryStream` (`System.IO`, CoreLib): seekable, read-only
stream over `ReadOnlyMemory<byte>`
- `WritableMemoryStream` (`System.IO`, CoreLib): seekable, read-write
stream over `Memory<byte>` with fixed capacity
- `ReadOnlySequenceStream` (`System.Buffers`, System.Memory): seekable,
read-only stream over `ReadOnlySequence<byte>`
- Ref assembly updates for `System.Runtime` and `System.Memory`
- Updated 3 internal call sites (`ReadOnlyMemoryContent`,
`XmlPreloadedResolver`, `JsonXmlDataContract`) to use the new types
- Conformance and behavioral tests for all 4 types
### Implementation notes
- All types are `public sealed` with direct constructors: the review
moved away from factory methods on `Stream` to avoid derived-type
IntelliSense noise
- `StringStream` encodes directly into the caller's buffer in `Read()`
rather than using an internal byte buffer
- `ReadOnlyMemoryStream` and `WritableMemoryStream` derive from
`MemoryStream`.
- `TryGetBuffer` returns false and `GetBuffer` throws on the memory
stream types (no `publiclyVisible` support for now)
### Limitations
- The internal
[shared-source](https://github.com/dotnet/runtime/blob/main/src/libraries/Common/src/System/IO/ReadOnlyMemoryStream.cs)
`ReadOnlyMemoryStream` in `Common/` cannot be fully replaced:
- `System.Memory.Data` multi-targets `netstandard2.0` where the new
public type doesn't exist.
- `System.Net.Http` (net11.0 only) can adopt it directly.
### Follow-up work
- `IBufferWriter<byte>` → `Stream` wrapper (separate proposal per
[dotnet#100434](dotnet#100434))
---------
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@ViveliDuChViveliDuCh self-assigned this Jun 24, 2026
CopilotAI review requested due to automatic review settings June 24, 2026 17:44
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @dotnet/area-system-memory
See info in area-owners.md if you want to be subscribed.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This backport introduces new public stream wrapper types for text and memory-backed data (StringStream, ReadOnlyMemoryStream, WritableMemoryStream, ReadOnlySequenceStream) and wires them into the appropriate libraries (CoreLib / System.Runtime and System.Memory), along with conformance + behavioral tests and a few call-site updates to use the new APIs.

Changes:

  • Added new public stream wrapper implementations in CoreLib (System.IO) and System.Memory (System.Buffers), plus updated ref assemblies.
  • Added conformance/behavioral tests for the new stream wrappers.
  • Updated call sites and shared-source usage (including removing the internal Common ReadOnlyMemoryStream for net11.0+ and updating System.Net.Http to use the public type).

Reviewed changes

Copilot reviewed 28 out of 29 changed files in this pull request and generated no comments.

Show a summary per file
FileDescription
src/libraries/System.Private.CoreLib/src/System/IO/StringStream.csImplements StringStream (read-only, non-seekable, on-the-fly encoding).
src/libraries/System.Private.CoreLib/src/System/IO/ReadOnlyMemoryStream.csImplements ReadOnlyMemoryStream over ReadOnlyMemory<byte>.
src/libraries/System.Private.CoreLib/src/System/IO/WritableMemoryStream.csImplements WritableMemoryStream over Memory<byte> with fixed capacity.
src/libraries/System.Private.CoreLib/src/System/IO/MemoryStream.csExposes selected MemoryStream fields as private protected to support in-assembly derived wrappers.
src/libraries/System.Private.CoreLib/src/System.Private.CoreLib.Shared.projitemsIncludes new CoreLib stream wrapper sources; switches CachedCompletedInt32Task to Common-linked source.
src/libraries/System.Runtime/ref/System.Runtime.csAdds ref-surface for StringStream, ReadOnlyMemoryStream, WritableMemoryStream.
src/libraries/System.Runtime/tests/System.IO.Tests/System.IO.Tests.csprojIncludes new test files for the added stream wrapper types.
src/libraries/System.Runtime/tests/System.IO.Tests/StringStream/StringStreamTestBase.csShared test harness for validating StringStream behaviors across read APIs.
src/libraries/System.Runtime/tests/System.IO.Tests/StringStream/StringStreamTests_String.csStringStream(string, Encoding) tests across sync/async read APIs and misc behaviors.
src/libraries/System.Runtime/tests/System.IO.Tests/StringStream/StringStreamTests_Memory.csStringStream(ReadOnlyMemory<char>, Encoding) tests including slicing and surrogate edge cases.
src/libraries/System.Runtime/tests/System.IO.Tests/StringStream/StringStreamConformanceTests.csConformance test coverage for StringStream using an identity encoding for arbitrary bytes.
src/libraries/System.Runtime/tests/System.IO.Tests/ReadOnlyMemoryStream/ReadOnlyMemoryStreamTests.csBehavioral tests for ReadOnlyMemoryStream.
src/libraries/System.Runtime/tests/System.IO.Tests/ReadOnlyMemoryStream/ReadOnlyMemoryStreamConformanceTests.csStream conformance coverage for ReadOnlyMemoryStream.
src/libraries/System.Runtime/tests/System.IO.Tests/WritableMemoryStream/WritableMemoryStreamTests.csBehavioral tests for WritableMemoryStream, especially capacity semantics.
src/libraries/System.Runtime/tests/System.IO.Tests/WritableMemoryStream/WritableMemoryStreamConformanceTests.csStream conformance coverage for WritableMemoryStream.
src/libraries/System.Memory/src/System/Buffers/ReadOnlySequenceStream.csImplements ReadOnlySequenceStream over ReadOnlySequence<byte>.
src/libraries/System.Memory/src/System.Memory.csprojIncludes ReadOnlySequenceStream and links CachedCompletedInt32Task from Common.
src/libraries/System.Memory/src/Resources/Strings.resxAdds SR strings needed for ReadOnlySequenceStream exceptions.
src/libraries/System.Memory/ref/System.Memory.csAdds ref-surface for ReadOnlySequenceStream.
src/libraries/System.Memory/tests/System.Memory.Tests.csprojAdds conformance test sources and references StreamConformanceTests for the new stream wrapper.
src/libraries/System.Memory/tests/ReadOnlyBuffer/ReadOnlySequenceStream.ConformanceTests.csConformance coverage for ReadOnlySequenceStream across single/multi/fragmented sequences.
src/libraries/System.Memory/tests/ReadOnlyBuffer/NativeMemoryOwningStream.csTest helper to own/dispose unmanaged buffers used by native-memory conformance tests.
src/libraries/System.Memory/tests/ReadOnlyBuffer/NativeReadOnlyMemoryStream.ConformanceTests.csConformance coverage for ReadOnlyMemoryStream over unmanaged-backed memory.
src/libraries/System.Memory/tests/ReadOnlyBuffer/NativeWritableMemoryStream.ConformanceTests.csConformance coverage for WritableMemoryStream over unmanaged-backed memory.
src/libraries/System.Memory.Data/tests/BinaryDataTests.csAdjusts exception expectations to align with updated seek/OD behavior.
src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/Json/JsonXmlDataContract.csUses StringStream instead of allocating a UTF-8 byte[] + MemoryStream.
src/libraries/System.Net.Http/src/System.Net.Http.csprojStops linking the internal Common ReadOnlyMemoryStream (uses public CoreLib type for net11+).
src/libraries/Common/src/System/IO/ReadOnlyMemoryStream.csExcludes internal Common ReadOnlyMemoryStream on net11.0+ (public CoreLib type supersedes it).
src/libraries/Common/src/System/Threading/Tasks/CachedCompletedInt32Task.csIntroduces Common-linked cached task helper used by stream implementations.

@jozkeejozkee added the Servicing-approved Approved for servicing release label Jun 24, 2026

@jeffhandleyjeffhandley left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Great to get this into Preview 6. Has my support!

@jozkee

Copy link
Copy Markdown
Member

/ba-g known errors only and 2 legs show as unfinished but they are cancelled.

@jozkee
jozkee merged commit 96f9c41 into dotnet:release/11.0-preview6Jun 25, 2026
149 of 157 checks passed
@dotnet-milestone-botdotnet-milestone-botBot added this to the 11.0-preview6 milestone Jun 25, 2026
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jul 25, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-System.MemoryServicing-approvedApproved for servicing release

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@ViveliDuCh@jozkee@jeffhandley
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

[release/11.0-preview6] Add Stream wrappers for memory and text-based types - #129811

Merged
jozkee merged 1 commit into
dotnet:release/11.0-preview6from
ViveliDuCh:backport-pr-126669
Jun 25, 2026
Merged

[release/11.0-preview6] Add Stream wrappers for memory and text-based types#129811
jozkee merged 1 commit into
dotnet:release/11.0-preview6from
ViveliDuCh:backport-pr-126669

Conversation

@ViveliDuCh

Copy link
Copy Markdown
Member

Backport of #126669 to release/11.0-preview6. See that PR for full details.

Adds new public stream wrapper APIs (StringStream, ReadOnlyMemoryStream, WritableMemoryStream, ReadOnlySequenceStream).

Fixes#82801.

Fixesdotnet#82801
Introduces standardized stream wrappers for text and memory types as
public sealed classes (`StringStream`, `ReadOnlyMemoryStream`,
`WritableMemoryStream`, and `ReadOnlySequenceStream` ) as approved in
[API
review](dotnet#82801 (comment))
([video](https://www.youtube.com/watch?v=T7xc7rARCEw&t=0h9m41s)).
### What's included
- `StringStream` (`System.IO`, CoreLib): non-seekable, read-only stream
that encodes `string` or `ReadOnlyMemory<char>` on-the-fly. Encoding is
required (no default). Never emits BOMs.
- `ReadOnlyMemoryStream` (`System.IO`, CoreLib): seekable, read-only
stream over `ReadOnlyMemory<byte>`
- `WritableMemoryStream` (`System.IO`, CoreLib): seekable, read-write
stream over `Memory<byte>` with fixed capacity
- `ReadOnlySequenceStream` (`System.Buffers`, System.Memory): seekable,
read-only stream over `ReadOnlySequence<byte>`
- Ref assembly updates for `System.Runtime` and `System.Memory`
- Updated 3 internal call sites (`ReadOnlyMemoryContent`,
`XmlPreloadedResolver`, `JsonXmlDataContract`) to use the new types
- Conformance and behavioral tests for all 4 types
### Implementation notes
- All types are `public sealed` with direct constructors: the review
moved away from factory methods on `Stream` to avoid derived-type
IntelliSense noise
- `StringStream` encodes directly into the caller's buffer in `Read()`
rather than using an internal byte buffer
- `ReadOnlyMemoryStream` and `WritableMemoryStream` derive from
`MemoryStream`.
- `TryGetBuffer` returns false and `GetBuffer` throws on the memory
stream types (no `publiclyVisible` support for now)
### Limitations
- The internal
[shared-source](https://github.com/dotnet/runtime/blob/main/src/libraries/Common/src/System/IO/ReadOnlyMemoryStream.cs)
`ReadOnlyMemoryStream` in `Common/` cannot be fully replaced:
- `System.Memory.Data` multi-targets `netstandard2.0` where the new
public type doesn't exist.
- `System.Net.Http` (net11.0 only) can adopt it directly.
### Follow-up work
- `IBufferWriter<byte>` → `Stream` wrapper (separate proposal per
[dotnet#100434](dotnet#100434))
---------
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@ViveliDuChViveliDuCh self-assigned this Jun 24, 2026
CopilotAI review requested due to automatic review settings June 24, 2026 17:44
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @dotnet/area-system-memory
See info in area-owners.md if you want to be subscribed.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This backport introduces new public stream wrapper types for text and memory-backed data (StringStream, ReadOnlyMemoryStream, WritableMemoryStream, ReadOnlySequenceStream) and wires them into the appropriate libraries (CoreLib / System.Runtime and System.Memory), along with conformance + behavioral tests and a few call-site updates to use the new APIs.

Changes:

  • Added new public stream wrapper implementations in CoreLib (System.IO) and System.Memory (System.Buffers), plus updated ref assemblies.
  • Added conformance/behavioral tests for the new stream wrappers.
  • Updated call sites and shared-source usage (including removing the internal Common ReadOnlyMemoryStream for net11.0+ and updating System.Net.Http to use the public type).

Reviewed changes

Copilot reviewed 28 out of 29 changed files in this pull request and generated no comments.

Show a summary per file
FileDescription
src/libraries/System.Private.CoreLib/src/System/IO/StringStream.csImplements StringStream (read-only, non-seekable, on-the-fly encoding).
src/libraries/System.Private.CoreLib/src/System/IO/ReadOnlyMemoryStream.csImplements ReadOnlyMemoryStream over ReadOnlyMemory<byte>.
src/libraries/System.Private.CoreLib/src/System/IO/WritableMemoryStream.csImplements WritableMemoryStream over Memory<byte> with fixed capacity.
src/libraries/System.Private.CoreLib/src/System/IO/MemoryStream.csExposes selected MemoryStream fields as private protected to support in-assembly derived wrappers.
src/libraries/System.Private.CoreLib/src/System.Private.CoreLib.Shared.projitemsIncludes new CoreLib stream wrapper sources; switches CachedCompletedInt32Task to Common-linked source.
src/libraries/System.Runtime/ref/System.Runtime.csAdds ref-surface for StringStream, ReadOnlyMemoryStream, WritableMemoryStream.
src/libraries/System.Runtime/tests/System.IO.Tests/System.IO.Tests.csprojIncludes new test files for the added stream wrapper types.
src/libraries/System.Runtime/tests/System.IO.Tests/StringStream/StringStreamTestBase.csShared test harness for validating StringStream behaviors across read APIs.
src/libraries/System.Runtime/tests/System.IO.Tests/StringStream/StringStreamTests_String.csStringStream(string, Encoding) tests across sync/async read APIs and misc behaviors.
src/libraries/System.Runtime/tests/System.IO.Tests/StringStream/StringStreamTests_Memory.csStringStream(ReadOnlyMemory<char>, Encoding) tests including slicing and surrogate edge cases.
src/libraries/System.Runtime/tests/System.IO.Tests/StringStream/StringStreamConformanceTests.csConformance test coverage for StringStream using an identity encoding for arbitrary bytes.
src/libraries/System.Runtime/tests/System.IO.Tests/ReadOnlyMemoryStream/ReadOnlyMemoryStreamTests.csBehavioral tests for ReadOnlyMemoryStream.
src/libraries/System.Runtime/tests/System.IO.Tests/ReadOnlyMemoryStream/ReadOnlyMemoryStreamConformanceTests.csStream conformance coverage for ReadOnlyMemoryStream.
src/libraries/System.Runtime/tests/System.IO.Tests/WritableMemoryStream/WritableMemoryStreamTests.csBehavioral tests for WritableMemoryStream, especially capacity semantics.
src/libraries/System.Runtime/tests/System.IO.Tests/WritableMemoryStream/WritableMemoryStreamConformanceTests.csStream conformance coverage for WritableMemoryStream.
src/libraries/System.Memory/src/System/Buffers/ReadOnlySequenceStream.csImplements ReadOnlySequenceStream over ReadOnlySequence<byte>.
src/libraries/System.Memory/src/System.Memory.csprojIncludes ReadOnlySequenceStream and links CachedCompletedInt32Task from Common.
src/libraries/System.Memory/src/Resources/Strings.resxAdds SR strings needed for ReadOnlySequenceStream exceptions.
src/libraries/System.Memory/ref/System.Memory.csAdds ref-surface for ReadOnlySequenceStream.
src/libraries/System.Memory/tests/System.Memory.Tests.csprojAdds conformance test sources and references StreamConformanceTests for the new stream wrapper.
src/libraries/System.Memory/tests/ReadOnlyBuffer/ReadOnlySequenceStream.ConformanceTests.csConformance coverage for ReadOnlySequenceStream across single/multi/fragmented sequences.
src/libraries/System.Memory/tests/ReadOnlyBuffer/NativeMemoryOwningStream.csTest helper to own/dispose unmanaged buffers used by native-memory conformance tests.
src/libraries/System.Memory/tests/ReadOnlyBuffer/NativeReadOnlyMemoryStream.ConformanceTests.csConformance coverage for ReadOnlyMemoryStream over unmanaged-backed memory.
src/libraries/System.Memory/tests/ReadOnlyBuffer/NativeWritableMemoryStream.ConformanceTests.csConformance coverage for WritableMemoryStream over unmanaged-backed memory.
src/libraries/System.Memory.Data/tests/BinaryDataTests.csAdjusts exception expectations to align with updated seek/OD behavior.
src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/Json/JsonXmlDataContract.csUses StringStream instead of allocating a UTF-8 byte[] + MemoryStream.
src/libraries/System.Net.Http/src/System.Net.Http.csprojStops linking the internal Common ReadOnlyMemoryStream (uses public CoreLib type for net11+).
src/libraries/Common/src/System/IO/ReadOnlyMemoryStream.csExcludes internal Common ReadOnlyMemoryStream on net11.0+ (public CoreLib type supersedes it).
src/libraries/Common/src/System/Threading/Tasks/CachedCompletedInt32Task.csIntroduces Common-linked cached task helper used by stream implementations.

@jozkeejozkee added the Servicing-approved Approved for servicing release label Jun 24, 2026

@jeffhandleyjeffhandley left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Great to get this into Preview 6. Has my support!

@jozkee

Copy link
Copy Markdown
Member

/ba-g known errors only and 2 legs show as unfinished but they are cancelled.

@jozkee
jozkee merged commit 96f9c41 into dotnet:release/11.0-preview6Jun 25, 2026
149 of 157 checks passed
@dotnet-milestone-botdotnet-milestone-botBot added this to the 11.0-preview6 milestone Jun 25, 2026
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jul 25, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-System.MemoryServicing-approvedApproved for servicing release

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@ViveliDuCh@jozkee@jeffhandley
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

[release/11.0-preview6] Add Stream wrappers for memory and text-based types - #129811

Merged
jozkee merged 1 commit into
dotnet:release/11.0-preview6from
ViveliDuCh:backport-pr-126669
Jun 25, 2026
Merged

[release/11.0-preview6] Add Stream wrappers for memory and text-based types#129811
jozkee merged 1 commit into
dotnet:release/11.0-preview6from
ViveliDuCh:backport-pr-126669

Conversation

@ViveliDuCh

Copy link
Copy Markdown
Member

Backport of #126669 to release/11.0-preview6. See that PR for full details.

Adds new public stream wrapper APIs (StringStream, ReadOnlyMemoryStream, WritableMemoryStream, ReadOnlySequenceStream).

Fixes#82801.

Fixesdotnet#82801
Introduces standardized stream wrappers for text and memory types as
public sealed classes (`StringStream`, `ReadOnlyMemoryStream`,
`WritableMemoryStream`, and `ReadOnlySequenceStream` ) as approved in
[API
review](dotnet#82801 (comment))
([video](https://www.youtube.com/watch?v=T7xc7rARCEw&t=0h9m41s)).
### What's included
- `StringStream` (`System.IO`, CoreLib): non-seekable, read-only stream
that encodes `string` or `ReadOnlyMemory<char>` on-the-fly. Encoding is
required (no default). Never emits BOMs.
- `ReadOnlyMemoryStream` (`System.IO`, CoreLib): seekable, read-only
stream over `ReadOnlyMemory<byte>`
- `WritableMemoryStream` (`System.IO`, CoreLib): seekable, read-write
stream over `Memory<byte>` with fixed capacity
- `ReadOnlySequenceStream` (`System.Buffers`, System.Memory): seekable,
read-only stream over `ReadOnlySequence<byte>`
- Ref assembly updates for `System.Runtime` and `System.Memory`
- Updated 3 internal call sites (`ReadOnlyMemoryContent`,
`XmlPreloadedResolver`, `JsonXmlDataContract`) to use the new types
- Conformance and behavioral tests for all 4 types
### Implementation notes
- All types are `public sealed` with direct constructors: the review
moved away from factory methods on `Stream` to avoid derived-type
IntelliSense noise
- `StringStream` encodes directly into the caller's buffer in `Read()`
rather than using an internal byte buffer
- `ReadOnlyMemoryStream` and `WritableMemoryStream` derive from
`MemoryStream`.
- `TryGetBuffer` returns false and `GetBuffer` throws on the memory
stream types (no `publiclyVisible` support for now)
### Limitations
- The internal
[shared-source](https://github.com/dotnet/runtime/blob/main/src/libraries/Common/src/System/IO/ReadOnlyMemoryStream.cs)
`ReadOnlyMemoryStream` in `Common/` cannot be fully replaced:
- `System.Memory.Data` multi-targets `netstandard2.0` where the new
public type doesn't exist.
- `System.Net.Http` (net11.0 only) can adopt it directly.
### Follow-up work
- `IBufferWriter<byte>` → `Stream` wrapper (separate proposal per
[dotnet#100434](dotnet#100434))
---------
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@ViveliDuChViveliDuCh self-assigned this Jun 24, 2026
CopilotAI review requested due to automatic review settings June 24, 2026 17:44
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @dotnet/area-system-memory
See info in area-owners.md if you want to be subscribed.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This backport introduces new public stream wrapper types for text and memory-backed data (StringStream, ReadOnlyMemoryStream, WritableMemoryStream, ReadOnlySequenceStream) and wires them into the appropriate libraries (CoreLib / System.Runtime and System.Memory), along with conformance + behavioral tests and a few call-site updates to use the new APIs.

Changes:

  • Added new public stream wrapper implementations in CoreLib (System.IO) and System.Memory (System.Buffers), plus updated ref assemblies.
  • Added conformance/behavioral tests for the new stream wrappers.
  • Updated call sites and shared-source usage (including removing the internal Common ReadOnlyMemoryStream for net11.0+ and updating System.Net.Http to use the public type).

Reviewed changes

Copilot reviewed 28 out of 29 changed files in this pull request and generated no comments.

Show a summary per file
FileDescription
src/libraries/System.Private.CoreLib/src/System/IO/StringStream.csImplements StringStream (read-only, non-seekable, on-the-fly encoding).
src/libraries/System.Private.CoreLib/src/System/IO/ReadOnlyMemoryStream.csImplements ReadOnlyMemoryStream over ReadOnlyMemory<byte>.
src/libraries/System.Private.CoreLib/src/System/IO/WritableMemoryStream.csImplements WritableMemoryStream over Memory<byte> with fixed capacity.
src/libraries/System.Private.CoreLib/src/System/IO/MemoryStream.csExposes selected MemoryStream fields as private protected to support in-assembly derived wrappers.
src/libraries/System.Private.CoreLib/src/System.Private.CoreLib.Shared.projitemsIncludes new CoreLib stream wrapper sources; switches CachedCompletedInt32Task to Common-linked source.
src/libraries/System.Runtime/ref/System.Runtime.csAdds ref-surface for StringStream, ReadOnlyMemoryStream, WritableMemoryStream.
src/libraries/System.Runtime/tests/System.IO.Tests/System.IO.Tests.csprojIncludes new test files for the added stream wrapper types.
src/libraries/System.Runtime/tests/System.IO.Tests/StringStream/StringStreamTestBase.csShared test harness for validating StringStream behaviors across read APIs.
src/libraries/System.Runtime/tests/System.IO.Tests/StringStream/StringStreamTests_String.csStringStream(string, Encoding) tests across sync/async read APIs and misc behaviors.
src/libraries/System.Runtime/tests/System.IO.Tests/StringStream/StringStreamTests_Memory.csStringStream(ReadOnlyMemory<char>, Encoding) tests including slicing and surrogate edge cases.
src/libraries/System.Runtime/tests/System.IO.Tests/StringStream/StringStreamConformanceTests.csConformance test coverage for StringStream using an identity encoding for arbitrary bytes.
src/libraries/System.Runtime/tests/System.IO.Tests/ReadOnlyMemoryStream/ReadOnlyMemoryStreamTests.csBehavioral tests for ReadOnlyMemoryStream.
src/libraries/System.Runtime/tests/System.IO.Tests/ReadOnlyMemoryStream/ReadOnlyMemoryStreamConformanceTests.csStream conformance coverage for ReadOnlyMemoryStream.
src/libraries/System.Runtime/tests/System.IO.Tests/WritableMemoryStream/WritableMemoryStreamTests.csBehavioral tests for WritableMemoryStream, especially capacity semantics.
src/libraries/System.Runtime/tests/System.IO.Tests/WritableMemoryStream/WritableMemoryStreamConformanceTests.csStream conformance coverage for WritableMemoryStream.
src/libraries/System.Memory/src/System/Buffers/ReadOnlySequenceStream.csImplements ReadOnlySequenceStream over ReadOnlySequence<byte>.
src/libraries/System.Memory/src/System.Memory.csprojIncludes ReadOnlySequenceStream and links CachedCompletedInt32Task from Common.
src/libraries/System.Memory/src/Resources/Strings.resxAdds SR strings needed for ReadOnlySequenceStream exceptions.
src/libraries/System.Memory/ref/System.Memory.csAdds ref-surface for ReadOnlySequenceStream.
src/libraries/System.Memory/tests/System.Memory.Tests.csprojAdds conformance test sources and references StreamConformanceTests for the new stream wrapper.
src/libraries/System.Memory/tests/ReadOnlyBuffer/ReadOnlySequenceStream.ConformanceTests.csConformance coverage for ReadOnlySequenceStream across single/multi/fragmented sequences.
src/libraries/System.Memory/tests/ReadOnlyBuffer/NativeMemoryOwningStream.csTest helper to own/dispose unmanaged buffers used by native-memory conformance tests.
src/libraries/System.Memory/tests/ReadOnlyBuffer/NativeReadOnlyMemoryStream.ConformanceTests.csConformance coverage for ReadOnlyMemoryStream over unmanaged-backed memory.
src/libraries/System.Memory/tests/ReadOnlyBuffer/NativeWritableMemoryStream.ConformanceTests.csConformance coverage for WritableMemoryStream over unmanaged-backed memory.
src/libraries/System.Memory.Data/tests/BinaryDataTests.csAdjusts exception expectations to align with updated seek/OD behavior.
src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/Json/JsonXmlDataContract.csUses StringStream instead of allocating a UTF-8 byte[] + MemoryStream.
src/libraries/System.Net.Http/src/System.Net.Http.csprojStops linking the internal Common ReadOnlyMemoryStream (uses public CoreLib type for net11+).
src/libraries/Common/src/System/IO/ReadOnlyMemoryStream.csExcludes internal Common ReadOnlyMemoryStream on net11.0+ (public CoreLib type supersedes it).
src/libraries/Common/src/System/Threading/Tasks/CachedCompletedInt32Task.csIntroduces Common-linked cached task helper used by stream implementations.

@jozkeejozkee added the Servicing-approved Approved for servicing release label Jun 24, 2026

@jeffhandleyjeffhandley left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Great to get this into Preview 6. Has my support!

@jozkee

Copy link
Copy Markdown
Member

/ba-g known errors only and 2 legs show as unfinished but they are cancelled.

@jozkee
jozkee merged commit 96f9c41 into dotnet:release/11.0-preview6Jun 25, 2026
149 of 157 checks passed
@dotnet-milestone-botdotnet-milestone-botBot added this to the 11.0-preview6 milestone Jun 25, 2026
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jul 25, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-System.MemoryServicing-approvedApproved for servicing release

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@ViveliDuCh@jozkee@jeffhandley