Skip to content

Commit 970977b

Browse files
Copilotjaviercn
andcommitted
Convert IPersistentComponentStateSerializer<T> interface to abstract class PersistentComponentStateSerializer<T>
Co-authored-by: javiercn <[email protected]>
1 parent 3b3af1d commit 970977b

File tree

8 files changed

+20
-22
lines changed

8 files changed

+20
-22
lines changed

src/Components/Components/src/IPersistentComponentStateSerializer.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
namespace Microsoft.AspNetCore.Components;
77

8-
public interface IPersistentComponentStateSerializer
8+
internal interface IPersistentComponentStateSerializer
99
{
1010
Task PersistAsync(Type type, object value, IBufferWriter<byte> writer);
1111
object Restore(Type type, ReadOnlySequence<byte> data);

src/Components/Components/src/IPersistentComponentStateSerializerOfT.cs renamed to src/Components/Components/src/PersistentComponentStateSerializer.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,23 +9,23 @@ namespace Microsoft.AspNetCore.Components;
99
/// Provides custom serialization logic for persistent component state values of type <typeparamref name="T"/>.
1010
/// </summary>
1111
/// <typeparam name="T">The type of the value to serialize.</typeparam>
12-
public interface IPersistentComponentStateSerializer<T> : IPersistentComponentStateSerializer
12+
public abstract class PersistentComponentStateSerializer<T> : IPersistentComponentStateSerializer
1313
{
1414
/// <summary>
1515
/// Serializes the provided <paramref name="value"/> and writes it to the <paramref name="writer"/>.
1616
/// </summary>
1717
/// <param name="value">The value to serialize.</param>
1818
/// <param name="writer">The buffer writer to write the serialized data to.</param>
1919
/// <returns>A task that represents the asynchronous serialization operation.</returns>
20-
Task PersistAsync(T value, IBufferWriter<byte> writer);
20+
public abstract Task PersistAsync(T value, IBufferWriter<byte> writer);
2121

2222
/// <summary>
2323
/// Deserializes a value of type <typeparamref name="T"/> from the provided <paramref name="data"/>.
2424
/// This method must be synchronous to avoid UI tearing during component state restoration.
2525
/// </summary>
2626
/// <param name="data">The serialized data to deserialize.</param>
2727
/// <returns>The deserialized value.</returns>
28-
T Restore(ReadOnlySequence<byte> data);
28+
public abstract T Restore(ReadOnlySequence<byte> data);
2929

3030
/// <summary>
3131
/// Explicit interface implementation for non-generic serialization.

src/Components/Components/src/PersistentStateValueProvider.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -106,10 +106,10 @@ private static PropertyGetter ResolvePropertyGetter(Type type, string propertyNa
106106

107107
private IPersistentComponentStateSerializer? SerializerFactory(Type type)
108108
{
109-
var serializerType = typeof(IPersistentComponentStateSerializer<>).MakeGenericType(type);
109+
var serializerType = typeof(PersistentComponentStateSerializer<>).MakeGenericType(type);
110110
var serializer = serviceProvider.GetService(serializerType);
111111

112-
// The generic interface now inherits from the internal interface, so we can cast directly
112+
// The generic class now inherits from the internal interface, so we can cast directly
113113
return serializer as IPersistentComponentStateSerializer;
114114
}
115115

@@ -331,7 +331,7 @@ private static bool IsSerializableKey(object key)
331331
/// <param name="key">The key to use to persist the state.</param>
332332
/// <param name="instance">The instance to persist.</param>
333333
/// <param name="serializer">The custom serializer to use for serialization.</param>
334-
internal async Task PersistAsync<TValue>(string key, TValue instance, IPersistentComponentStateSerializer<TValue> serializer)
334+
internal async Task PersistAsync<TValue>(string key, TValue instance, PersistentComponentStateSerializer<TValue> serializer)
335335
{
336336
ArgumentNullException.ThrowIfNull(key);
337337
ArgumentNullException.ThrowIfNull(serializer);
@@ -351,7 +351,7 @@ internal async Task PersistAsync<TValue>(string key, TValue instance, IPersisten
351351
/// <param name="serializer">The custom serializer to use for deserialization.</param>
352352
/// <param name="instance">The persisted instance.</param>
353353
/// <returns><c>true</c> if the state was found; <c>false</c> otherwise.</returns>
354-
internal bool TryTake<TValue>(string key, IPersistentComponentStateSerializer<TValue> serializer, [MaybeNullWhen(false)] out TValue instance)
354+
internal bool TryTake<TValue>(string key, PersistentComponentStateSerializer<TValue> serializer, [MaybeNullWhen(false)] out TValue instance)
355355
{
356356
ArgumentNullException.ThrowIfNull(key);
357357
ArgumentNullException.ThrowIfNull(serializer);

src/Components/Components/src/PublicAPI.Unshipped.txt

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,10 @@ Microsoft.AspNetCore.Components.Infrastructure.RegisterPersistentComponentStateS
1616
Microsoft.AspNetCore.Components.PersistentStateAttribute
1717
Microsoft.AspNetCore.Components.PersistentStateAttribute.PersistentStateAttribute() -> void
1818
Microsoft.AspNetCore.Components.Infrastructure.PersistentStateProviderServiceCollectionExtensions
19-
Microsoft.AspNetCore.Components.IPersistentComponentStateSerializer
20-
Microsoft.AspNetCore.Components.IPersistentComponentStateSerializer.PersistAsync(System.Type! type, object! value, System.Buffers.IBufferWriter<byte>! writer) -> System.Threading.Tasks.Task!
21-
Microsoft.AspNetCore.Components.IPersistentComponentStateSerializer.Restore(System.Type! type, System.Buffers.ReadOnlySequence<byte> data) -> object!
22-
Microsoft.AspNetCore.Components.IPersistentComponentStateSerializer<T>
23-
Microsoft.AspNetCore.Components.IPersistentComponentStateSerializer<T>.PersistAsync(T value, System.Buffers.IBufferWriter<byte>! writer) -> System.Threading.Tasks.Task!
24-
Microsoft.AspNetCore.Components.IPersistentComponentStateSerializer<T>.Restore(System.Buffers.ReadOnlySequence<byte> data) -> T
19+
Microsoft.AspNetCore.Components.PersistentComponentStateSerializer<T>
20+
Microsoft.AspNetCore.Components.PersistentComponentStateSerializer<T>.PersistentComponentStateSerializer() -> void
21+
abstract Microsoft.AspNetCore.Components.PersistentComponentStateSerializer<T>.PersistAsync(T value, System.Buffers.IBufferWriter<byte>! writer) -> System.Threading.Tasks.Task!
22+
abstract Microsoft.AspNetCore.Components.PersistentComponentStateSerializer<T>.Restore(System.Buffers.ReadOnlySequence<byte> data) -> T
2523
static Microsoft.AspNetCore.Components.Infrastructure.RegisterPersistentComponentStateServiceCollectionExtensions.AddPersistentServiceRegistration<TService>(Microsoft.Extensions.DependencyInjection.IServiceCollection! services, Microsoft.AspNetCore.Components.IComponentRenderMode! componentRenderMode) -> Microsoft.Extensions.DependencyInjection.IServiceCollection!
2624
static Microsoft.AspNetCore.Components.Infrastructure.ComponentsMetricsServiceCollectionExtensions.AddComponentsMetrics(Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> Microsoft.Extensions.DependencyInjection.IServiceCollection!
2725
static Microsoft.AspNetCore.Components.Infrastructure.ComponentsMetricsServiceCollectionExtensions.AddComponentsTracing(Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> Microsoft.Extensions.DependencyInjection.IServiceCollection!

src/Components/Components/test/IPersistentComponentStateSerializerTests.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -62,16 +62,16 @@ public void TryTake_CanUseCustomSerializer()
6262
Assert.Equal(customData, retrievedValue);
6363
}
6464

65-
private class TestStringSerializer : IPersistentComponentStateSerializer<string>
65+
private class TestStringSerializer : PersistentComponentStateSerializer<string>
6666
{
67-
public Task PersistAsync(string value, IBufferWriter<byte> writer)
67+
public override Task PersistAsync(string value, IBufferWriter<byte> writer)
6868
{
6969
var bytes = Encoding.UTF8.GetBytes(value);
7070
writer.Write(bytes);
7171
return Task.CompletedTask;
7272
}
7373

74-
public string Restore(ReadOnlySequence<byte> data)
74+
public override string Restore(ReadOnlySequence<byte> data)
7575
{
7676
var bytes = data.ToArray();
7777
return Encoding.UTF8.GetString(bytes);

src/Components/test/testassets/Components.TestServer/RazorComponentEndpointsStartup.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ public void ConfigureServices(IServiceCollection services)
6767
services.AddScoped<InteractiveAutoService>();
6868

6969
// Register custom serializer for E2E testing of persistent component state serialization extensibility
70-
services.AddSingleton<IPersistentComponentStateSerializer<int>, CustomIntSerializer>();
70+
services.AddSingleton<PersistentComponentStateSerializer<int>, CustomIntSerializer>();
7171

7272
services.AddHttpContextAccessor();
7373
services.AddSingleton<AsyncOperationService>();

src/Components/test/testassets/Components.WasmMinimal/Program.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
builder.Services.AddSingleton<InteractiveServerService>();
1818

1919
// Register custom serializer for persistent component state
20-
builder.Services.AddSingleton<IPersistentComponentStateSerializer<int>, CustomIntSerializer>();
20+
builder.Services.AddSingleton<PersistentComponentStateSerializer<int>, CustomIntSerializer>();
2121

2222
builder.Services.AddCascadingAuthenticationState();
2323

src/Components/test/testassets/TestContentPackage/CustomIntSerializer.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,17 +11,17 @@ namespace TestContentPackage;
1111
/// A custom serializer for int values that uses a custom format to test serialization extensibility.
1212
/// This serializer prefixes integer values with "CUSTOM:" to clearly distinguish them from JSON serialization.
1313
/// </summary>
14-
public class CustomIntSerializer : IPersistentComponentStateSerializer<int>
14+
public class CustomIntSerializer : PersistentComponentStateSerializer<int>
1515
{
16-
public Task PersistAsync(int value, IBufferWriter<byte> writer)
16+
public override Task PersistAsync(int value, IBufferWriter<byte> writer)
1717
{
1818
var customFormat = $"CUSTOM:{value}";
1919
var bytes = Encoding.UTF8.GetBytes(customFormat);
2020
writer.Write(bytes);
2121
return Task.CompletedTask;
2222
}
2323

24-
public int Restore(ReadOnlySequence<byte> data)
24+
public override int Restore(ReadOnlySequence<byte> data)
2525
{
2626
var bytes = data.ToArray();
2727
var text = Encoding.UTF8.GetString(bytes);

0 commit comments

Comments
 (0)