Skip to content

Commit ee4ab1b

Browse files
Convert a stream to a byte array: retarget net10.0, add ReadExactly, CopyTo and the reverse direction (#2219)
Retargets both projects from net7.0 to net10.0 and moves the packages to current stable versions (BenchmarkDotNet 0.15.8, Microsoft.NET.Test.Sdk 18.10.1, xunit 2.9.3, xunit.runner.visualstudio 4.0.0, coverlet.collector 10.0.1). Adds UseReadExactly() and UseCopyTo() to ConvertStreamToByteArray, which are the two calls the article now recommends, and UseMemoryStreamConstructor() and UseWritableMemoryStream() for the reverse direction. Four xunit tests cover them, and UseReadExactly and UseCopyTo also join ConvertMethodsBenchmark so the published benchmark measures the recommended methods. Build is clean and tests run 9 of 9 on SDK 10.0.302.
1 parent 1302032 commit ee4ab1b

5 files changed

Lines changed: 94 additions & 7 deletions

File tree

‎csharp-intermediate-topics/HowToConvertAStreamToAByteArray/HowToConvertAStreamToAByteArray/ConvertMethodsBenchmark.cs‎

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,20 @@ public void Setup()
1818
_convertStreamToByteArray = new ConvertStreamToByteArray();
1919
}
2020

21+
[Benchmark]
22+
public void UseReadExactly()
23+
{
24+
using var _benchmarkStream = new FileStream(_sampleFilePath, FileMode.Open, FileAccess.Read);
25+
_convertStreamToByteArray.UseReadExactly(_benchmarkStream);
26+
}
27+
28+
[Benchmark]
29+
public void UseCopyTo()
30+
{
31+
using var _benchmarkStream = new FileStream(_sampleFilePath, FileMode.Open, FileAccess.Read);
32+
_convertStreamToByteArray.UseCopyTo(_benchmarkStream);
33+
}
34+
2135
[Benchmark]
2236
public void UseStreamDotReadMethod()
2337
{

‎csharp-intermediate-topics/HowToConvertAStreamToAByteArray/HowToConvertAStreamToAByteArray/ConvertStreamToByteArray.cs‎

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,23 @@
22
{
33
public class ConvertStreamToByteArray
44
{
5+
public byte[] UseReadExactly(Stream stream)
6+
{
7+
var bytes = new byte[stream.Length];
8+
stream.ReadExactly(bytes);
9+
10+
return bytes;
11+
}
12+
13+
public byte[] UseCopyTo(Stream stream)
14+
{
15+
using var memoryStream = new MemoryStream();
16+
stream.CopyTo(memoryStream);
17+
18+
return memoryStream.ToArray();
19+
}
20+
21+
522
public byte[] UseStreamDotReadMethod(Stream stream)
623
{
724
byte[] bytes;
@@ -73,5 +90,19 @@ public byte[] UseBufferedStream(Stream stream)
7390

7491
return bytes;
7592
}
93+
94+
public Stream UseMemoryStreamConstructor(byte[] bytes)
95+
{
96+
return new MemoryStream(bytes);
97+
}
98+
99+
public Stream UseWritableMemoryStream(byte[] bytes)
100+
{
101+
var stream = new MemoryStream();
102+
stream.Write(bytes, 0, bytes.Length);
103+
stream.Position = 0;
104+
105+
return stream;
106+
}
76107
}
77108
}

‎csharp-intermediate-topics/HowToConvertAStreamToAByteArray/HowToConvertAStreamToAByteArray/HowToConvertAStreamToAByteArray.csproj‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,13 @@
22

33
<PropertyGroup>
44
<OutputType>Exe</OutputType>
5-
<TargetFramework>net7.0</TargetFramework>
5+
<TargetFramework>net10.0</TargetFramework>
66
<ImplicitUsings>enable</ImplicitUsings>
77
<Nullable>disable</Nullable>
88
</PropertyGroup>
99

1010
<ItemGroup>
11-
<PackageReference Include="BenchmarkDotNet" Version="0.13.5" />
11+
<PackageReference Include="BenchmarkDotNet" Version="0.15.8" />
1212
</ItemGroup>
1313

1414
</Project>

‎csharp-intermediate-topics/HowToConvertAStreamToAByteArray/Tests/ConvertMethodsTest.cs‎

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,5 +57,47 @@ public void GivenAStream_WhenConvertingWithStreamReader_ThenReturnsAByteArray()
5757

5858
Assert.Equal(_expected, result);
5959
}
60+
61+
[Fact]
62+
public void GivenAStream_WhenConvertingWithReadExactly_ThenReturnsAByteArray()
63+
{
64+
var result = _converter.UseReadExactly(_stream);
65+
66+
Assert.Equal(_expected, result);
67+
}
68+
69+
[Fact]
70+
public void GivenAStream_WhenConvertingWithCopyTo_ThenReturnsAByteArray()
71+
{
72+
var result = _converter.UseCopyTo(_stream);
73+
74+
Assert.Equal(_expected, result);
75+
}
76+
77+
[Fact]
78+
public void GivenAByteArray_WhenWrappingInAMemoryStreamConstructor_ThenStreamReadsBackTheSameBytes()
79+
{
80+
var result = _converter.UseMemoryStreamConstructor(_expected);
81+
82+
Assert.Equal(_expected.Length, result.Length);
83+
Assert.Equal(_expected, ReadToEnd(result));
84+
}
85+
86+
[Fact]
87+
public void GivenAByteArray_WhenWritingToAnExpandableMemoryStream_ThenStreamReadsBackTheSameBytes()
88+
{
89+
var result = _converter.UseWritableMemoryStream(_expected);
90+
91+
Assert.Equal(_expected.Length, result.Length);
92+
Assert.Equal(_expected, ReadToEnd(result));
93+
}
94+
95+
private static byte[] ReadToEnd(Stream stream)
96+
{
97+
using var memoryStream = new MemoryStream();
98+
stream.CopyTo(memoryStream);
99+
100+
return memoryStream.ToArray();
101+
}
60102
}
61103
}

‎csharp-intermediate-topics/HowToConvertAStreamToAByteArray/Tests/Tests.csproj‎

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,21 @@
11
<Project Sdk="Microsoft.NET.Sdk">
22

33
<PropertyGroup>
4-
<TargetFramework>net7.0</TargetFramework>
4+
<TargetFramework>net10.0</TargetFramework>
55
<ImplicitUsings>enable</ImplicitUsings>
66
<Nullable>disable</Nullable>
77

88
<IsPackable>false</IsPackable>
99
</PropertyGroup>
1010

1111
<ItemGroup>
12-
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.3.2" />
13-
<PackageReference Include="xunit" Version="2.4.2" />
14-
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.5">
12+
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="18.10.1" />
13+
<PackageReference Include="xunit" Version="2.9.3" />
14+
<PackageReference Include="xunit.runner.visualstudio" Version="4.0.0">
1515
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
1616
<PrivateAssets>all</PrivateAssets>
1717
</PackageReference>
18-
<PackageReference Include="coverlet.collector" Version="3.1.2">
18+
<PackageReference Include="coverlet.collector" Version="10.0.1">
1919
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
2020
<PrivateAssets>all</PrivateAssets>
2121
</PackageReference>

0 commit comments

Comments
 (0)