diff --git a/samples/BlazorServer/Startup.cs b/samples/BlazorServer/Startup.cs index afb1033..2e8b1f0 100644 --- a/samples/BlazorServer/Startup.cs +++ b/samples/BlazorServer/Startup.cs @@ -8,6 +8,7 @@ using Blazored.SessionStorage.Serialization; using Newtonsoft.Json; using System; +using System.Threading.Tasks; namespace BlazorServer { @@ -62,7 +63,17 @@ public class NewtonSoftJsonSerializer : IJsonSerializer public T Deserialize(string text) =>JsonConvert.DeserializeObject(text); + public async Task DeserializeAsync(string text) + { + return await Task.Run(() => JsonConvert.DeserializeObject(text)); + } + public string Serialize(T obj) => JsonConvert.SerializeObject(obj); + + public async Task SerializeAsync(T obj) + { + return await Task.Run(() => JsonConvert.SerializeObject(obj)) +; } } } diff --git a/src/Blazored.SessionStorage/Blazored - Backup.SessionStorage.csproj b/src/Blazored.SessionStorage/Blazored - Backup.SessionStorage.csproj new file mode 100644 index 0000000..c473355 --- /dev/null +++ b/src/Blazored.SessionStorage/Blazored - Backup.SessionStorage.csproj @@ -0,0 +1,68 @@ + + + + net7.0 + Chris Sainty + + Copyright 2020 (c) Chris Sainty. All rights reserved. + A library to provide access to session storage in Blazor applications + true + snupkg + + + Blazored.SessionStorage + Blazored;Blazor;Razor;Components;SessionStorage;Session Storage;ASP.NET Core;CSharp;Web + MIT + https://github.com/Blazored/SessionStorage + icon.png + git + https://github.com/Blazored/SessionStorage + + + true + true + true + Blazored.SessionStorage.snk + + + + 3.0 + + + + + + + + + + + + + + + + + + + + + <_Parameter1> + Blazored.SessionStorage.TestExtensions, PublicKey=00240000048000009400000006020000002400005253413100040000010001007527e122cc36dc13c695a4f43b7c2da3f631aed456ed309140c0d52262323e25d84bef7feddc8bd29cfe46ec652186cb10e059eedabf2ff000b977a2376a613dccfb092de6c243e0888db4c66a084124b2c1799bda4bbb2f70fed0382fc1cbdafa6dc0f4baccdc2cee55234f8a5ad76645c315523fee5352d9f01036e48b13e3 + + + + + + + <_Parameter1> + Blazored.SessionStorage.Tests, PublicKey=00240000048000009400000006020000002400005253413100040000010001007527e122cc36dc13c695a4f43b7c2da3f631aed456ed309140c0d52262323e25d84bef7feddc8bd29cfe46ec652186cb10e059eedabf2ff000b977a2376a613dccfb092de6c243e0888db4c66a084124b2c1799bda4bbb2f70fed0382fc1cbdafa6dc0f4baccdc2cee55234f8a5ad76645c315523fee5352d9f01036e48b13e3 + + + + + + + + + diff --git a/src/Blazored.SessionStorage/Blazored.SessionStorage.csproj b/src/Blazored.SessionStorage/Blazored.SessionStorage.csproj index 194b03e..40d4ab8 100644 --- a/src/Blazored.SessionStorage/Blazored.SessionStorage.csproj +++ b/src/Blazored.SessionStorage/Blazored.SessionStorage.csproj @@ -1,8 +1,7 @@  - netstandard2.1;net5.0 - + net7.0 Chris Sainty Copyright 2020 (c) Chris Sainty. All rights reserved. @@ -62,4 +61,10 @@ + + + + + + diff --git a/src/Blazored.SessionStorage/Serialization/IJsonSerializer.cs b/src/Blazored.SessionStorage/Serialization/IJsonSerializer.cs index 9bccf18..7f4169a 100644 --- a/src/Blazored.SessionStorage/Serialization/IJsonSerializer.cs +++ b/src/Blazored.SessionStorage/Serialization/IJsonSerializer.cs @@ -1,8 +1,12 @@ +using System.Threading.Tasks; + namespace Blazored.SessionStorage.Serialization { public interface IJsonSerializer { string Serialize(T obj); T Deserialize(string text); + ValueTask SerializeAsync(T obj); + ValueTask DeserializeAsync(string text); } } diff --git a/src/Blazored.SessionStorage/Serialization/SystemTextJsonSerializer.cs b/src/Blazored.SessionStorage/Serialization/SystemTextJsonSerializer.cs index 5ce56c0..5e972cc 100644 --- a/src/Blazored.SessionStorage/Serialization/SystemTextJsonSerializer.cs +++ b/src/Blazored.SessionStorage/Serialization/SystemTextJsonSerializer.cs @@ -1,6 +1,8 @@ using Blazored.SessionStorage.StorageOptions; using Microsoft.Extensions.Options; +using System.IO; using System.Text.Json; +using System.Threading.Tasks; namespace Blazored.SessionStorage.Serialization { @@ -23,5 +25,32 @@ public T Deserialize(string data) public string Serialize(T data) => JsonSerializer.Serialize(data, _options); + + public async ValueTask SerializeAsync(T data) + { + using (var stream = new MemoryStream()) + { + await JsonSerializer.SerializeAsync(stream, data, data.GetType()); + stream.Position = 0; + using var reader = new StreamReader(stream); + return await reader.ReadToEndAsync(); + } + } + + public async ValueTask DeserializeAsync(string data) + { + var strm = await ToStream(data); + return await JsonSerializer.DeserializeAsync(strm); + } + + private async ValueTask ToStream(string str) + { + var stream = new MemoryStream(); + var writer = new StreamWriter(stream); + await writer.WriteAsync(str); + await writer.FlushAsync(); + stream.Position = 0; + return stream; + } } } diff --git a/src/Blazored.SessionStorage/SessionStorageService.cs b/src/Blazored.SessionStorage/SessionStorageService.cs index d020994..60f8d26 100644 --- a/src/Blazored.SessionStorage/SessionStorageService.cs +++ b/src/Blazored.SessionStorage/SessionStorageService.cs @@ -27,7 +27,7 @@ public async ValueTask SetItemAsync(string key, T data, CancellationToken? ca if (e.Cancel) return; - var serialisedData = _serializer.Serialize(data); + var serialisedData = await _serializer.SerializeAsync(data); await _storageProvider.SetItemAsync(key, serialisedData, cancellationToken).ConfigureAwait(false); RaiseOnChanged(key, e.OldValue, data); @@ -63,7 +63,7 @@ public async ValueTask GetItemAsync(string key, CancellationToken? cancell try { - return _serializer.Deserialize(serialisedData); + return await _serializer.DeserializeAsync(serialisedData); } catch (JsonException e) when (e.Path == "$" && typeof(T) == typeof(string)) { @@ -225,7 +225,7 @@ private async Task GetItemInternalAsync(string key) return default; try { - return _serializer.Deserialize(serialisedData); + return await _serializer.DeserializeAsync(serialisedData); } catch (JsonException) {