From 81015b7354748e3bf38a5ab8fb8eb22c946e3585 Mon Sep 17 00:00:00 2001 From: Andrew Arnott Date: Sat, 1 Feb 2025 14:55:44 -0700 Subject: [PATCH 1/2] Convert `IMessagePackConverter` to an abstract base class Closes #246 --- .../ConverterAnalyzers.cs | 15 +++++--- .../ReferenceSymbols.cs | 8 ++-- src/Nerdbank.MessagePack/ConverterCache.cs | 4 +- .../Converters/CommonRecords.cs | 6 +-- .../Converters/SubTypeUnionConverter`1.cs | 20 +++++----- .../IMessagePackConverterInternal.cs | 6 +-- src/Nerdbank.MessagePack/JsonSchemaContext.cs | 2 +- ...ckConverter.cs => MessagePackConverter.cs} | 34 ++++++++++------- .../MessagePackConverter`1.cs | 37 ++++++++++--------- .../MessagePackSerializer.cs | 6 +-- .../SerializationContext.cs | 10 ++--- src/Nerdbank.MessagePack/StandardVisitor.cs | 10 ++--- .../StreamingDeserializer`1.cs | 4 +- .../net8.0/PublicAPI.Unshipped.txt | 35 ++++++++++-------- .../netstandard2.0/PublicAPI.Unshipped.txt | 35 ++++++++++-------- .../ConverterAnalyzersTests.cs | 4 +- .../CustomConverterTests.cs | 8 ++-- 17 files changed, 134 insertions(+), 110 deletions(-) rename src/Nerdbank.MessagePack/{IMessagePackConverter.cs => MessagePackConverter.cs} (65%) diff --git a/src/Nerdbank.MessagePack.Analyzers/ConverterAnalyzers.cs b/src/Nerdbank.MessagePack.Analyzers/ConverterAnalyzers.cs index e7f26b82..cef491de 100644 --- a/src/Nerdbank.MessagePack.Analyzers/ConverterAnalyzers.cs +++ b/src/Nerdbank.MessagePack.Analyzers/ConverterAnalyzers.cs @@ -191,7 +191,7 @@ public override void Initialize(AnalysisContext context) context.RegisterSymbolEndAction(context => { INamedTypeSymbol symbol = (INamedTypeSymbol)context.Symbol; - if (!symbol.GetAllMembers().Any(m => m is IMethodSymbol { Name: "GetJsonSchema", OverriddenMethod: not null })) + if (!symbol.GetAllMembers().Any(m => m is IMethodSymbol { Name: "GetJsonSchema", OverriddenMethod: not null } && IsOverriddenInConcreteConverter(m))) { if (symbol.Locations.FirstOrDefault(l => l.IsInSource) is { } location) { @@ -202,13 +202,16 @@ public override void Initialize(AnalysisContext context) if (isAsyncConverter) { // This converter specifically implements async functionality. - IPropertySymbol? prefersAsyncSerialization = symbol.GetAllMembers().OfType().FirstOrDefault(p => p is { Name: "PreferAsyncSerialization", OverriddenProperty: not null }); + IPropertySymbol? prefersAsyncSerialization = symbol.GetAllMembers().OfType().FirstOrDefault(p => p is { Name: "PreferAsyncSerialization", OverriddenProperty: not null } && IsOverriddenInConcreteConverter(p)); if (prefersAsyncSerialization is null) { context.ReportDiagnostic(Diagnostic.Create(AsyncConverterShouldOverridePreferAsyncSerializationDescriptor, symbol.Locations.FirstOrDefault(l => l.IsInSource))); } } }); + + bool IsOverriddenInConcreteConverter(ISymbol member) + => !(member.ContainingType.IsGenericType && SymbolEqualityComparer.Default.Equals(member.ContainingType.ConstructUnboundGenericType(), referenceSymbols.MessagePackConverterUnbound)); } } }, @@ -242,11 +245,11 @@ string t when t.StartsWith("Write", StringComparison.Ordinal) => (1, true), _ => (0, true), }; } - else if (i.TargetMethod.ContainingSymbol is ITypeSymbol s && (s.IsOrDerivedFrom(referenceSymbols.IMessagePackConverter) || s.IsOrDerivedFrom(referenceSymbols.MessagePackConverterUnbound))) + else if (i.TargetMethod.ContainingSymbol is ITypeSymbol s && (s.IsOrDerivedFrom(referenceSymbols.MessagePackConverterNonGeneric) || s.IsOrDerivedFrom(referenceSymbols.MessagePackConverterUnbound))) { return i.TargetMethod.Name switch { - "Write" or "WriteAsync" => (1, true), + "Write" or "WriteAsync" or "WriteObject" or "WriteObjectAsync" => (1, true), _ => (0, true), }; } @@ -273,11 +276,11 @@ string t when t.StartsWith("Read", StringComparison.Ordinal) => (1, true), _ => (0, true), }; } - else if (i.TargetMethod.ContainingSymbol is ITypeSymbol s && (s.IsOrDerivedFrom(referenceSymbols.IMessagePackConverter) || s.IsOrDerivedFrom(referenceSymbols.MessagePackConverterUnbound))) + else if (i.TargetMethod.ContainingSymbol is ITypeSymbol s && (s.IsOrDerivedFrom(referenceSymbols.MessagePackConverterNonGeneric) || s.IsOrDerivedFrom(referenceSymbols.MessagePackConverterUnbound))) { return i.TargetMethod.Name switch { - "Read" or "ReadAsync" => (1, true), + "Read" or "ReadAsync" or "ReadObject" or "ReadObjectAsync" => (1, true), _ => (0, true), }; } diff --git a/src/Nerdbank.MessagePack.Analyzers/ReferenceSymbols.cs b/src/Nerdbank.MessagePack.Analyzers/ReferenceSymbols.cs index 6ab74d1c..65206259 100644 --- a/src/Nerdbank.MessagePack.Analyzers/ReferenceSymbols.cs +++ b/src/Nerdbank.MessagePack.Analyzers/ReferenceSymbols.cs @@ -8,7 +8,7 @@ namespace Nerdbank.MessagePack.Analyzers; public record ReferenceSymbols( INamedTypeSymbol MessagePackSerializer, INamedTypeSymbol MessagePackConverter, - INamedTypeSymbol IMessagePackConverter, + INamedTypeSymbol MessagePackConverterNonGeneric, INamedTypeSymbol MessagePackConverterAttribute, INamedTypeSymbol MessagePackReader, INamedTypeSymbol MessagePackStreamingReader, @@ -53,8 +53,8 @@ public static bool TryCreate(Compilation compilation, [NotNullWhen(true)] out Re return false; } - INamedTypeSymbol? imessagePackConverter = libraryAssembly.GetTypeByMetadataName("Nerdbank.MessagePack.IMessagePackConverter"); - if (imessagePackConverter is null) + INamedTypeSymbol? messagePackConverterNonGeneric = libraryAssembly.GetTypeByMetadataName("Nerdbank.MessagePack.MessagePackConverter"); + if (messagePackConverterNonGeneric is null) { referenceSymbols = null; return false; @@ -133,7 +133,7 @@ public static bool TryCreate(Compilation compilation, [NotNullWhen(true)] out Re referenceSymbols = new ReferenceSymbols( messagePackSerializer, messagePackConverter, - imessagePackConverter, + messagePackConverterNonGeneric, messagePackConverterAttribute, messagePackReader, messagePackStreamingReader, diff --git a/src/Nerdbank.MessagePack/ConverterCache.cs b/src/Nerdbank.MessagePack/ConverterCache.cs index ceef33bd..2b14d90d 100644 --- a/src/Nerdbank.MessagePack/ConverterCache.cs +++ b/src/Nerdbank.MessagePack/ConverterCache.cs @@ -286,8 +286,8 @@ internal MessagePackConverter GetOrAddConverter(ITypeShape shape) /// /// The shape of the type to convert. /// A msgpack converter. - internal IMessagePackConverterInternal GetOrAddConverter(ITypeShape shape) - => (IMessagePackConverterInternal)this.CachedConverters.GetOrAdd(shape)!; + internal MessagePackConverter GetOrAddConverter(ITypeShape shape) + => (MessagePackConverter)this.CachedConverters.GetOrAdd(shape)!; /// /// Gets a converter for the given type shape. diff --git a/src/Nerdbank.MessagePack/Converters/CommonRecords.cs b/src/Nerdbank.MessagePack/Converters/CommonRecords.cs index 2dbb22b2..7533c581 100644 --- a/src/Nerdbank.MessagePack/Converters/CommonRecords.cs +++ b/src/Nerdbank.MessagePack/Converters/CommonRecords.cs @@ -138,15 +138,15 @@ internal record SubTypes /// /// Gets the converters to use to deserialize a subtype, keyed by its integer alias. /// - internal required FrozenDictionary DeserializersByIntAlias { get; init; } + internal required FrozenDictionary DeserializersByIntAlias { get; init; } /// /// Gets the converter to use to deserialize a subtype, keyed by its UTF-8 encoded string alias. /// - internal required SpanDictionary DeserializersByStringAlias { get; init; } + internal required SpanDictionary DeserializersByStringAlias { get; init; } /// /// Gets the converter and alias to use for a subtype, keyed by their . /// - internal required FrozenDictionary Serializers { get; init; } + internal required FrozenDictionary Serializers { get; init; } } diff --git a/src/Nerdbank.MessagePack/Converters/SubTypeUnionConverter`1.cs b/src/Nerdbank.MessagePack/Converters/SubTypeUnionConverter`1.cs index 1f694282..5bf09b51 100644 --- a/src/Nerdbank.MessagePack/Converters/SubTypeUnionConverter`1.cs +++ b/src/Nerdbank.MessagePack/Converters/SubTypeUnionConverter`1.cs @@ -51,7 +51,7 @@ internal SubTypeUnionConverter(SubTypes subTypes, MessagePackConverter ba return this.baseConverter.Read(ref reader, context); } - IMessagePackConverter? converter; + MessagePackConverter? converter; if (reader.NextMessagePackType == MessagePackType.Integer) { int alias = reader.ReadInt32(); @@ -69,10 +69,10 @@ internal SubTypeUnionConverter(SubTypes subTypes, MessagePackConverter ba } } - return (TBase?)converter.Read(ref reader, context); + return (TBase?)converter.ReadObject(ref reader, context); } -#pragma warning disable NBMsgPack031 // Exactly one structure -- it can't see internal IMessagePackConverter.Write calls +#pragma warning disable NBMsgPack031 // Exactly one structure -- it doesn't (yet) see MessagePackConverter.WriteObject calls /// public override void Write(ref MessagePackWriter writer, in TBase? value, SerializationContext context) { @@ -91,10 +91,10 @@ public override void Write(ref MessagePackWriter writer, in TBase? value, Serial writer.WriteNil(); this.baseConverter.Write(ref writer, value, context); } - else if (this.subTypes.Serializers.TryGetValue(valueType, out (SubTypeAlias Alias, IMessagePackConverter Converter, ITypeShape Shape) result)) + else if (this.subTypes.Serializers.TryGetValue(valueType, out (SubTypeAlias Alias, MessagePackConverter Converter, ITypeShape Shape) result)) { writer.WriteRaw(result.Alias.MsgPackAlias.Span); - result.Converter.Write(ref writer, value, context); + result.Converter.WriteObject(ref writer, value, context); } else { @@ -151,7 +151,7 @@ public override void Write(ref MessagePackWriter writer, in TBase? value, Serial streamingReader = new(await streamingReader.FetchMoreBytesAsync().ConfigureAwait(false)); } - IMessagePackConverter? converter; + MessagePackConverter? converter; if (nextMessagePackType == MessagePackType.Integer) { int alias; @@ -187,7 +187,7 @@ public override void Write(ref MessagePackWriter writer, in TBase? value, Serial } reader.ReturnReader(ref streamingReader); - return (TBase?)await converter.ReadAsync(reader, context).ConfigureAwait(false); + return (TBase?)await converter.ReadObjectAsync(reader, context).ConfigureAwait(false); } /// @@ -219,17 +219,17 @@ public override async ValueTask WriteAsync(MessagePackAsyncWriter writer, TBase? writer.ReturnWriter(ref syncWriter); } } - else if (this.subTypes.Serializers.TryGetValue(valueType, out (SubTypeAlias Alias, IMessagePackConverter Converter, ITypeShape Shape) result)) + else if (this.subTypes.Serializers.TryGetValue(valueType, out (SubTypeAlias Alias, MessagePackConverter Converter, ITypeShape Shape) result)) { syncWriter.WriteRaw(result.Alias.MsgPackAlias.Span); if (result.Converter.PreferAsyncSerialization) { writer.ReturnWriter(ref syncWriter); - await result.Converter.WriteAsync(writer, value, context).ConfigureAwait(false); + await result.Converter.WriteObjectAsync(writer, value, context).ConfigureAwait(false); } else { - result.Converter.Write(ref syncWriter, value, context); + result.Converter.WriteObject(ref syncWriter, value, context); writer.ReturnWriter(ref syncWriter); } } diff --git a/src/Nerdbank.MessagePack/IMessagePackConverterInternal.cs b/src/Nerdbank.MessagePack/IMessagePackConverterInternal.cs index a7f0c96b..0478ac6b 100644 --- a/src/Nerdbank.MessagePack/IMessagePackConverterInternal.cs +++ b/src/Nerdbank.MessagePack/IMessagePackConverterInternal.cs @@ -6,17 +6,17 @@ namespace Nerdbank.MessagePack; /// /// Non-generic access to internal methods of . /// -internal interface IMessagePackConverterInternal : IMessagePackConverter +internal interface IMessagePackConverterInternal { /// /// Wraps this converter with a reference preservation converter. /// /// A converter. Possibly if this instance is already reference preserving. - IMessagePackConverterInternal WrapWithReferencePreservation(); + MessagePackConverter WrapWithReferencePreservation(); /// /// Removes the outer reference preserving converter, if present. /// /// The unwrapped converter. - IMessagePackConverterInternal UnwrapReferencePreservation(); + MessagePackConverter UnwrapReferencePreservation(); } diff --git a/src/Nerdbank.MessagePack/JsonSchemaContext.cs b/src/Nerdbank.MessagePack/JsonSchemaContext.cs index 548af465..273d5971 100644 --- a/src/Nerdbank.MessagePack/JsonSchemaContext.cs +++ b/src/Nerdbank.MessagePack/JsonSchemaContext.cs @@ -54,7 +54,7 @@ public JsonObject GetJsonSchema(ITypeShape typeShape) return CreateReference(qualifiedReference); } - IMessagePackConverter converter = this.cache.GetOrAddConverter(typeShape); + MessagePackConverter converter = this.cache.GetOrAddConverter(typeShape); if (converter.GetJsonSchema(this, typeShape) is not JsonObject schema) { schema = MessagePackConverter.CreateUndocumentedSchema(converter.GetType()); diff --git a/src/Nerdbank.MessagePack/IMessagePackConverter.cs b/src/Nerdbank.MessagePack/MessagePackConverter.cs similarity index 65% rename from src/Nerdbank.MessagePack/IMessagePackConverter.cs rename to src/Nerdbank.MessagePack/MessagePackConverter.cs index 6ec005e4..47f01f3d 100644 --- a/src/Nerdbank.MessagePack/IMessagePackConverter.cs +++ b/src/Nerdbank.MessagePack/MessagePackConverter.cs @@ -7,19 +7,19 @@ namespace Nerdbank.MessagePack; /// -/// A non-generic, -based interface for all message pack converters. +/// A non-generic, -based base class for all message pack converters. /// -public interface IMessagePackConverter +public abstract class MessagePackConverter { /// /// Gets a value indicating whether callers should prefer the async methods on this object. /// /// Unless overridden in a derived converter, this value is always . /// - /// Derived types that override the and/or methods + /// Derived types that override the and/or methods /// should also override this property and have it return . /// - bool PreferAsyncSerialization { get; } + public abstract bool PreferAsyncSerialization { get; } /// /// Serializes an instance of an object. @@ -27,7 +27,10 @@ public interface IMessagePackConverter /// The writer to use. /// The value to serialize. /// Context for the serialization. - void Write(ref MessagePackWriter writer, object? value, SerializationContext context); + /// + /// Implementations of this method should not flush the writer. + /// + public abstract void WriteObject(ref MessagePackWriter writer, object? value, SerializationContext context); /// /// Deserializes an instance of an object. @@ -35,19 +38,19 @@ public interface IMessagePackConverter /// The reader to use. /// Context for the deserialization. /// The deserialized value. - object? Read(ref MessagePackReader reader, SerializationContext context); + public abstract object? ReadObject(ref MessagePackReader reader, SerializationContext context); - /// + /// /// A task that tracks the asynchronous operation. [Experimental("NBMsgPackAsync")] - ValueTask WriteAsync(MessagePackAsyncWriter writer, object? value, SerializationContext context); + public abstract ValueTask WriteObjectAsync(MessagePackAsyncWriter writer, object? value, SerializationContext context); - /// + /// [Experimental("NBMsgPackAsync")] - ValueTask ReadAsync(MessagePackAsyncReader reader, SerializationContext context); + public abstract ValueTask ReadObjectAsync(MessagePackAsyncReader reader, SerializationContext context); /// - JsonObject? GetJsonSchema(JsonSchemaContext context, ITypeShape typeShape); + public abstract JsonObject? GetJsonSchema(JsonSchemaContext context, ITypeShape typeShape); /// /// Skips ahead in the msgpack data to the point where the value of the specified property can be read. @@ -58,7 +61,7 @@ public interface IMessagePackConverter /// if the specified property was found in the data and the value is ready to be read; otherwise. /// [Experimental("NBMsgPackAsync")] - ValueTask SkipToPropertyValueAsync(MessagePackAsyncReader reader, IPropertyShape propertyShape, SerializationContext context); + public abstract ValueTask SkipToPropertyValueAsync(MessagePackAsyncReader reader, IPropertyShape propertyShape, SerializationContext context); /// /// Skips ahead in the msgpack data to the point where the value at the specified index can be read. @@ -72,5 +75,10 @@ public interface IMessagePackConverter /// to skip to the starting position of a sequence that should be asynchronously enumerated. /// [Experimental("NBMsgPackAsync")] - ValueTask SkipToIndexValueAsync(MessagePackAsyncReader reader, object? index, SerializationContext context); + public abstract ValueTask SkipToIndexValueAsync(MessagePackAsyncReader reader, object? index, SerializationContext context); + + /// + /// Just insurance that no external assembly can derive a concrete type from this type, except through the generic . + /// + internal abstract void DerivationGuard(); } diff --git a/src/Nerdbank.MessagePack/MessagePackConverter`1.cs b/src/Nerdbank.MessagePack/MessagePackConverter`1.cs index 7ee30e8d..01dc5d2a 100644 --- a/src/Nerdbank.MessagePack/MessagePackConverter`1.cs +++ b/src/Nerdbank.MessagePack/MessagePackConverter`1.cs @@ -1,6 +1,7 @@ // Copyright (c) Andrew Arnott. All rights reserved. // Licensed under the MIT license. See LICENSE file in the project root for full license information. +using System.ComponentModel; using System.Diagnostics.CodeAnalysis; using System.Text.Json.Nodes; using Microsoft; @@ -29,10 +30,10 @@ namespace Nerdbank.MessagePack; /// . /// /// -public abstract class MessagePackConverter : IMessagePackConverter, IMessagePackConverterInternal +public abstract class MessagePackConverter : MessagePackConverter, IMessagePackConverterInternal { /// - public virtual bool PreferAsyncSerialization => false; + public override bool PreferAsyncSerialization => false; /// /// Serializes an instance of . @@ -139,43 +140,39 @@ public virtual ValueTask WriteAsync(MessagePackAsyncWriter writer, T? value, Ser /// /// /// - public virtual JsonObject? GetJsonSchema(JsonSchemaContext context, ITypeShape typeShape) => null; + public override JsonObject? GetJsonSchema(JsonSchemaContext context, ITypeShape typeShape) => null; /// [Experimental("NBMsgPackAsync")] - public virtual ValueTask SkipToPropertyValueAsync(MessagePackAsyncReader reader, IPropertyShape propertyShape, SerializationContext context) + public override ValueTask SkipToPropertyValueAsync(MessagePackAsyncReader reader, IPropertyShape propertyShape, SerializationContext context) => throw new NotSupportedException($"The {this.GetType().FullName} converter does not support this operation."); /// [Experimental("NBMsgPackAsync")] - public virtual ValueTask SkipToIndexValueAsync(MessagePackAsyncReader reader, object? index, SerializationContext context) + public override ValueTask SkipToIndexValueAsync(MessagePackAsyncReader reader, object? index, SerializationContext context) => throw new NotSupportedException($"The {this.GetType().FullName} converter does not support this operation."); /// - void IMessagePackConverter.Write(ref MessagePackWriter writer, object? value, SerializationContext context) - { - this.Write(ref writer, (T?)value, context); - } + public override sealed void WriteObject(ref MessagePackWriter writer, object? value, SerializationContext context) => this.Write(ref writer, (T?)value, context); /// - object? IMessagePackConverter.Read(ref MessagePackReader reader, SerializationContext context) - { - return this.Read(ref reader, context); - } + public override sealed object? ReadObject(ref MessagePackReader reader, SerializationContext context) => this.Read(ref reader, context); /// [Experimental("NBMsgPackAsync")] - ValueTask IMessagePackConverter.WriteAsync(MessagePackAsyncWriter writer, object? value, SerializationContext context) => this.WriteAsync(writer, (T?)value, context); + [EditorBrowsable(EditorBrowsableState.Never)] // Use the generic methods instead. + public override sealed ValueTask WriteObjectAsync(MessagePackAsyncWriter writer, object? value, SerializationContext context) => this.WriteAsync(writer, (T?)value, context); /// [Experimental("NBMsgPackAsync")] - async ValueTask IMessagePackConverter.ReadAsync(MessagePackAsyncReader reader, SerializationContext context) => await this.ReadAsync(reader, context).ConfigureAwait(false); + [EditorBrowsable(EditorBrowsableState.Never)] // Use the generic methods instead. + public override sealed async ValueTask ReadObjectAsync(MessagePackAsyncReader reader, SerializationContext context) => await this.ReadAsync(reader, context).ConfigureAwait(false); /// - IMessagePackConverterInternal IMessagePackConverterInternal.WrapWithReferencePreservation() => this.WrapWithReferencePreservation(); + MessagePackConverter IMessagePackConverterInternal.WrapWithReferencePreservation() => this.WrapWithReferencePreservation(); /// - IMessagePackConverterInternal IMessagePackConverterInternal.UnwrapReferencePreservation() => this.UnwrapReferencePreservation(); + MessagePackConverter IMessagePackConverterInternal.UnwrapReferencePreservation() => this.UnwrapReferencePreservation(); /// internal virtual MessagePackConverter WrapWithReferencePreservation() => typeof(T).IsValueType ? this : new ReferencePreservingConverter(this); @@ -183,6 +180,12 @@ void IMessagePackConverter.Write(ref MessagePackWriter writer, object? value, Se /// internal virtual MessagePackConverter UnwrapReferencePreservation() => this; + /// + internal override sealed void DerivationGuard() + { + throw new NotImplementedException(); + } + /// /// Transforms a JSON schema to include "null" as a possible value for the schema. /// diff --git a/src/Nerdbank.MessagePack/MessagePackSerializer.cs b/src/Nerdbank.MessagePack/MessagePackSerializer.cs index f4d5d942..564c3a8d 100644 --- a/src/Nerdbank.MessagePack/MessagePackSerializer.cs +++ b/src/Nerdbank.MessagePack/MessagePackSerializer.cs @@ -151,7 +151,7 @@ public void SerializeObject(ref MessagePackWriter writer, object? value, ITypeSh Requires.NotNull(shape); using DisposableSerializationContext context = this.CreateSerializationContext(shape.Provider, cancellationToken); - this.converterCache.GetOrAddConverter(shape).Write(ref writer, value, context.Value); + this.converterCache.GetOrAddConverter(shape).WriteObject(ref writer, value, context.Value); } /// @@ -198,7 +198,7 @@ public void Serialize(ref MessagePackWriter writer, in T? value, ITypeShapePr Requires.NotNull(shape); using DisposableSerializationContext context = this.CreateSerializationContext(shape.Provider, cancellationToken); - return this.converterCache.GetOrAddConverter(shape).Read(ref reader, context.Value); + return this.converterCache.GetOrAddConverter(shape).ReadObject(ref reader, context.Value); } /// @@ -493,7 +493,7 @@ static void WriteJsonString(string value, TextWriter builder) /// /// The type shape. /// A converter. - internal IMessagePackConverterInternal GetConverter(ITypeShape typeShape) => this.converterCache.GetOrAddConverter(typeShape); + internal MessagePackConverter GetConverter(ITypeShape typeShape) => this.converterCache.GetOrAddConverter(typeShape); /// /// Creates a new serialization context that is ready to process a serialization job. diff --git a/src/Nerdbank.MessagePack/SerializationContext.cs b/src/Nerdbank.MessagePack/SerializationContext.cs index 504a09a3..aa89b5e0 100644 --- a/src/Nerdbank.MessagePack/SerializationContext.cs +++ b/src/Nerdbank.MessagePack/SerializationContext.cs @@ -178,11 +178,11 @@ public MessagePackConverter GetConverter(ITypeShapeProvider? provider) /// /// This method is intended only for use by custom converters in order to delegate conversion of sub-values. /// - public IMessagePackConverter GetConverter(ITypeShape shape) + public MessagePackConverter GetConverter(ITypeShape shape) { Verify.Operation(this.Cache is not null, "No serialization operation is in progress."); - IMessagePackConverterInternal result = this.Cache.GetOrAddConverter(shape); - return this.ReferenceEqualityTracker is null ? result : result.WrapWithReferencePreservation(); + MessagePackConverter result = this.Cache.GetOrAddConverter(shape); + return this.ReferenceEqualityTracker is null ? result : ((IMessagePackConverterInternal)result).WrapWithReferencePreservation(); } /// @@ -195,11 +195,11 @@ public IMessagePackConverter GetConverter(ITypeShape shape) /// /// This method is intended only for use by custom converters in order to delegate conversion of sub-values. /// - public IMessagePackConverter GetConverter(Type type, ITypeShapeProvider? provider) + public MessagePackConverter GetConverter(Type type, ITypeShapeProvider? provider) { Verify.Operation(this.Cache is not null, "No serialization operation is in progress."); IMessagePackConverterInternal result = this.Cache.GetOrAddConverter(type, provider ?? this.TypeShapeProvider ?? throw new UnreachableException()); - return this.ReferenceEqualityTracker is null ? result : result.WrapWithReferencePreservation(); + return this.ReferenceEqualityTracker is null ? (MessagePackConverter)result : result.WrapWithReferencePreservation(); } /// diff --git a/src/Nerdbank.MessagePack/StandardVisitor.cs b/src/Nerdbank.MessagePack/StandardVisitor.cs index d58c0070..2569c139 100644 --- a/src/Nerdbank.MessagePack/StandardVisitor.cs +++ b/src/Nerdbank.MessagePack/StandardVisitor.cs @@ -532,9 +532,9 @@ protected IMessagePackConverterInternal GetConverter(ITypeShape shape, object? s mapping = mutableMapping; } - Dictionary deserializeByIntData = new(); - Dictionary, IMessagePackConverter> deserializeByUtf8Data = new(); - Dictionary serializerData = new(); + Dictionary deserializeByIntData = new(); + Dictionary, MessagePackConverter> deserializeByUtf8Data = new(); + Dictionary serializerData = new(); foreach (KeyValuePair pair in mapping) { SubTypeAlias alias = pair.Key; @@ -543,7 +543,7 @@ protected IMessagePackConverterInternal GetConverter(ITypeShape shape, object? s // We don't want a reference-preserving converter here because that layer has already run // by the time our subtype converter is invoked. // And doubling up on it means values get serialized incorrectly. - IMessagePackConverter converter = this.GetConverter(shape).UnwrapReferencePreservation(); + MessagePackConverter converter = this.GetConverter(shape).UnwrapReferencePreservation(); switch (alias.Type) { case SubTypeAlias.AliasType.Integer: @@ -562,7 +562,7 @@ protected IMessagePackConverterInternal GetConverter(ITypeShape shape, object? s return new SubTypes { DeserializersByIntAlias = deserializeByIntData.ToFrozenDictionary(), - DeserializersByStringAlias = new SpanDictionary(deserializeByUtf8Data, ByteSpanEqualityComparer.Ordinal), + DeserializersByStringAlias = new SpanDictionary(deserializeByUtf8Data, ByteSpanEqualityComparer.Ordinal), Serializers = serializerData.ToFrozenDictionary(), }; } diff --git a/src/Nerdbank.MessagePack/StreamingDeserializer`1.cs b/src/Nerdbank.MessagePack/StreamingDeserializer`1.cs index 49503ce6..3fca116c 100644 --- a/src/Nerdbank.MessagePack/StreamingDeserializer`1.cs +++ b/src/Nerdbank.MessagePack/StreamingDeserializer`1.cs @@ -162,7 +162,7 @@ private struct AsyncExpressionVisitor(MessagePackSerializer serializer, MessageP // We use a converter to do the actual skipping. ITypeShape? typeShape = provider.GetShape(expression.Object.Type); Requires.Argument(typeShape is not null, nameof(expression), "The expression does not have a known type shape."); - IMessagePackConverterInternal converter = serializer.GetConverter(typeShape); + MessagePackConverter converter = serializer.GetConverter(typeShape); return await converter.SkipToIndexValueAsync(reader, indexArg, context).ConfigureAwait(false) ? null : expression; } @@ -242,7 +242,7 @@ private struct AsyncExpressionVisitor(MessagePackSerializer serializer, MessageP Requires.Argument(propertyShape is not null, nameof(expression), "The expression does not refer to a serialized property."); // We use a converter to do the actual skipping. - IMessagePackConverterInternal converter = serializer.GetConverter(typeShape); + MessagePackConverter converter = serializer.GetConverter(typeShape); return await converter.SkipToPropertyValueAsync(reader, propertyShape, context).ConfigureAwait(false) ? null : expression; diff --git a/src/Nerdbank.MessagePack/net8.0/PublicAPI.Unshipped.txt b/src/Nerdbank.MessagePack/net8.0/PublicAPI.Unshipped.txt index a9ea9792..86ec9f19 100644 --- a/src/Nerdbank.MessagePack/net8.0/PublicAPI.Unshipped.txt +++ b/src/Nerdbank.MessagePack/net8.0/PublicAPI.Unshipped.txt @@ -1,3 +1,7 @@ +abstract Nerdbank.MessagePack.MessagePackConverter.GetJsonSchema(Nerdbank.MessagePack.JsonSchemaContext! context, PolyType.Abstractions.ITypeShape! typeShape) -> System.Text.Json.Nodes.JsonObject? +abstract Nerdbank.MessagePack.MessagePackConverter.PreferAsyncSerialization.get -> bool +abstract Nerdbank.MessagePack.MessagePackConverter.ReadObject(ref Nerdbank.MessagePack.MessagePackReader reader, Nerdbank.MessagePack.SerializationContext context) -> object? +abstract Nerdbank.MessagePack.MessagePackConverter.WriteObject(ref Nerdbank.MessagePack.MessagePackWriter writer, object? value, Nerdbank.MessagePack.SerializationContext context) -> void abstract Nerdbank.MessagePack.MessagePackConverter.Read(ref Nerdbank.MessagePack.MessagePackReader reader, Nerdbank.MessagePack.SerializationContext context) -> T? abstract Nerdbank.MessagePack.MessagePackConverter.Write(ref Nerdbank.MessagePack.MessagePackWriter writer, in T? value, Nerdbank.MessagePack.SerializationContext context) -> void abstract Nerdbank.MessagePack.MessagePackNamingPolicy.ConvertName(string! name) -> string! @@ -69,11 +73,6 @@ Nerdbank.MessagePack.IDeepSecureEqualityComparer Nerdbank.MessagePack.IDeepSecureEqualityComparer.DeepEquals(T? other) -> bool Nerdbank.MessagePack.IDeepSecureEqualityComparer.GetHashCode() -> int Nerdbank.MessagePack.IDeepSecureEqualityComparer.GetSecureHashCode() -> long -Nerdbank.MessagePack.IMessagePackConverter -Nerdbank.MessagePack.IMessagePackConverter.GetJsonSchema(Nerdbank.MessagePack.JsonSchemaContext! context, PolyType.Abstractions.ITypeShape! typeShape) -> System.Text.Json.Nodes.JsonObject? -Nerdbank.MessagePack.IMessagePackConverter.PreferAsyncSerialization.get -> bool -Nerdbank.MessagePack.IMessagePackConverter.Read(ref Nerdbank.MessagePack.MessagePackReader reader, Nerdbank.MessagePack.SerializationContext context) -> object? -Nerdbank.MessagePack.IMessagePackConverter.Write(ref Nerdbank.MessagePack.MessagePackWriter writer, object? value, Nerdbank.MessagePack.SerializationContext context) -> void Nerdbank.MessagePack.IMessagePackSerializationCallbacks Nerdbank.MessagePack.IMessagePackSerializationCallbacks.OnAfterDeserialize() -> void Nerdbank.MessagePack.IMessagePackSerializationCallbacks.OnBeforeSerialize() -> void @@ -107,6 +106,8 @@ Nerdbank.MessagePack.LibraryReservedMessagePackExtensionTypeCode.LibraryReserved Nerdbank.MessagePack.LibraryReservedMessagePackExtensionTypeCode.ObjectReference.get -> sbyte Nerdbank.MessagePack.LibraryReservedMessagePackExtensionTypeCode.ObjectReference.init -> void Nerdbank.MessagePack.MessagePackCode +Nerdbank.MessagePack.MessagePackConverter +Nerdbank.MessagePack.MessagePackConverter.MessagePackConverter() -> void Nerdbank.MessagePack.MessagePackConverter Nerdbank.MessagePack.MessagePackConverter.MessagePackConverter() -> void Nerdbank.MessagePack.MessagePackConverterAttribute @@ -357,8 +358,8 @@ Nerdbank.MessagePack.SerializationContext.CancellationToken.get -> System.Thread Nerdbank.MessagePack.SerializationContext.CancellationToken.init -> void Nerdbank.MessagePack.SerializationContext.DepthStep() -> void Nerdbank.MessagePack.SerializationContext.Equals(Nerdbank.MessagePack.SerializationContext other) -> bool -Nerdbank.MessagePack.SerializationContext.GetConverter(PolyType.Abstractions.ITypeShape! shape) -> Nerdbank.MessagePack.IMessagePackConverter! -Nerdbank.MessagePack.SerializationContext.GetConverter(System.Type! type, PolyType.ITypeShapeProvider? provider) -> Nerdbank.MessagePack.IMessagePackConverter! +Nerdbank.MessagePack.SerializationContext.GetConverter(PolyType.Abstractions.ITypeShape! shape) -> Nerdbank.MessagePack.MessagePackConverter! +Nerdbank.MessagePack.SerializationContext.GetConverter(System.Type! type, PolyType.ITypeShapeProvider? provider) -> Nerdbank.MessagePack.MessagePackConverter! Nerdbank.MessagePack.SerializationContext.GetConverter() -> Nerdbank.MessagePack.MessagePackConverter! Nerdbank.MessagePack.SerializationContext.GetConverter() -> Nerdbank.MessagePack.MessagePackConverter! Nerdbank.MessagePack.SerializationContext.GetConverter(PolyType.ITypeShapeProvider? provider) -> Nerdbank.MessagePack.MessagePackConverter! @@ -383,6 +384,8 @@ override Nerdbank.MessagePack.KnownSubTypeAttribute.Sh override Nerdbank.MessagePack.LibraryReservedMessagePackExtensionTypeCode.Equals(object? obj) -> bool override Nerdbank.MessagePack.LibraryReservedMessagePackExtensionTypeCode.GetHashCode() -> int override Nerdbank.MessagePack.LibraryReservedMessagePackExtensionTypeCode.ToString() -> string! +override Nerdbank.MessagePack.MessagePackConverter.GetJsonSchema(Nerdbank.MessagePack.JsonSchemaContext! context, PolyType.Abstractions.ITypeShape! typeShape) -> System.Text.Json.Nodes.JsonObject? +override Nerdbank.MessagePack.MessagePackConverter.PreferAsyncSerialization.get -> bool override Nerdbank.MessagePack.MessagePackSerializer.Equals(object? obj) -> bool override Nerdbank.MessagePack.MessagePackSerializer.GetHashCode() -> int override Nerdbank.MessagePack.MessagePackSerializer.ToString() -> string! @@ -392,6 +395,8 @@ override Nerdbank.MessagePack.MessagePackSerializer.StreamingEnumerationOptions< override Nerdbank.MessagePack.MessagePackString.Equals(object? obj) -> bool override Nerdbank.MessagePack.MessagePackString.GetHashCode() -> int override Nerdbank.MessagePack.SerializationContext.GetHashCode() -> int +override sealed Nerdbank.MessagePack.MessagePackConverter.ReadObject(ref Nerdbank.MessagePack.MessagePackReader reader, Nerdbank.MessagePack.SerializationContext context) -> object? +override sealed Nerdbank.MessagePack.MessagePackConverter.WriteObject(ref Nerdbank.MessagePack.MessagePackWriter writer, object? value, Nerdbank.MessagePack.SerializationContext context) -> void static Nerdbank.MessagePack.DecodeResultExtensions.NeedsMoreBytes(this Nerdbank.MessagePack.MessagePackPrimitives.DecodeResult result) -> bool static Nerdbank.MessagePack.Extension.operator !=(Nerdbank.MessagePack.Extension left, Nerdbank.MessagePack.Extension right) -> bool static Nerdbank.MessagePack.Extension.operator ==(Nerdbank.MessagePack.Extension left, Nerdbank.MessagePack.Extension right) -> bool @@ -487,8 +492,6 @@ virtual Nerdbank.MessagePack.LibraryReservedMessagePackExtensionTypeCode. virtual Nerdbank.MessagePack.LibraryReservedMessagePackExtensionTypeCode.EqualityContract.get -> System.Type! virtual Nerdbank.MessagePack.LibraryReservedMessagePackExtensionTypeCode.Equals(Nerdbank.MessagePack.LibraryReservedMessagePackExtensionTypeCode? other) -> bool virtual Nerdbank.MessagePack.LibraryReservedMessagePackExtensionTypeCode.PrintMembers(System.Text.StringBuilder! builder) -> bool -virtual Nerdbank.MessagePack.MessagePackConverter.GetJsonSchema(Nerdbank.MessagePack.JsonSchemaContext! context, PolyType.Abstractions.ITypeShape! typeShape) -> System.Text.Json.Nodes.JsonObject? -virtual Nerdbank.MessagePack.MessagePackConverter.PreferAsyncSerialization.get -> bool virtual Nerdbank.MessagePack.MessagePackSerializer.$() -> Nerdbank.MessagePack.MessagePackSerializer! virtual Nerdbank.MessagePack.MessagePackSerializer.EqualityContract.get -> System.Type! virtual Nerdbank.MessagePack.MessagePackSerializer.Equals(Nerdbank.MessagePack.MessagePackSerializer? other) -> bool @@ -497,10 +500,10 @@ virtual Nerdbank.MessagePack.MessagePackSerializer.StreamingEnumerationOptions.EqualityContract.get -> System.Type! virtual Nerdbank.MessagePack.MessagePackSerializer.StreamingEnumerationOptions.Equals(Nerdbank.MessagePack.MessagePackSerializer.StreamingEnumerationOptions? other) -> bool virtual Nerdbank.MessagePack.MessagePackSerializer.StreamingEnumerationOptions.PrintMembers(System.Text.StringBuilder! builder) -> bool -[NBMsgPackAsync]Nerdbank.MessagePack.IMessagePackConverter.ReadAsync(Nerdbank.MessagePack.MessagePackAsyncReader! reader, Nerdbank.MessagePack.SerializationContext context) -> System.Threading.Tasks.ValueTask -[NBMsgPackAsync]Nerdbank.MessagePack.IMessagePackConverter.SkipToIndexValueAsync(Nerdbank.MessagePack.MessagePackAsyncReader! reader, object? index, Nerdbank.MessagePack.SerializationContext context) -> System.Threading.Tasks.ValueTask -[NBMsgPackAsync]Nerdbank.MessagePack.IMessagePackConverter.SkipToPropertyValueAsync(Nerdbank.MessagePack.MessagePackAsyncReader! reader, PolyType.Abstractions.IPropertyShape! propertyShape, Nerdbank.MessagePack.SerializationContext context) -> System.Threading.Tasks.ValueTask -[NBMsgPackAsync]Nerdbank.MessagePack.IMessagePackConverter.WriteAsync(Nerdbank.MessagePack.MessagePackAsyncWriter! writer, object? value, Nerdbank.MessagePack.SerializationContext context) -> System.Threading.Tasks.ValueTask +[NBMsgPackAsync]abstract Nerdbank.MessagePack.MessagePackConverter.ReadObjectAsync(Nerdbank.MessagePack.MessagePackAsyncReader! reader, Nerdbank.MessagePack.SerializationContext context) -> System.Threading.Tasks.ValueTask +[NBMsgPackAsync]abstract Nerdbank.MessagePack.MessagePackConverter.SkipToIndexValueAsync(Nerdbank.MessagePack.MessagePackAsyncReader! reader, object? index, Nerdbank.MessagePack.SerializationContext context) -> System.Threading.Tasks.ValueTask +[NBMsgPackAsync]abstract Nerdbank.MessagePack.MessagePackConverter.SkipToPropertyValueAsync(Nerdbank.MessagePack.MessagePackAsyncReader! reader, PolyType.Abstractions.IPropertyShape! propertyShape, Nerdbank.MessagePack.SerializationContext context) -> System.Threading.Tasks.ValueTask +[NBMsgPackAsync]abstract Nerdbank.MessagePack.MessagePackConverter.WriteObjectAsync(Nerdbank.MessagePack.MessagePackAsyncWriter! writer, object? value, Nerdbank.MessagePack.SerializationContext context) -> System.Threading.Tasks.ValueTask [NBMsgPackAsync]Nerdbank.MessagePack.MessagePackAsyncReader [NBMsgPackAsync]Nerdbank.MessagePack.MessagePackAsyncReader.BufferNextStructureAsync(Nerdbank.MessagePack.SerializationContext context) -> System.Threading.Tasks.ValueTask [NBMsgPackAsync]Nerdbank.MessagePack.MessagePackAsyncReader.BufferNextStructuresAsync(int minimumDesiredBufferedStructures, int countUpTo, Nerdbank.MessagePack.SerializationContext context) -> System.Threading.Tasks.ValueTask @@ -572,10 +575,12 @@ virtual Nerdbank.MessagePack.MessagePackSerializer.StreamingEnumerationOptions value) -> Nerdbank.MessagePack.MessagePackPrimitives.DecodeResult [NBMsgPackAsync]Nerdbank.MessagePack.MessagePackStreamingReader.TryReadStringSpan(out bool contiguous, out System.ReadOnlySpan value) -> Nerdbank.MessagePack.MessagePackPrimitives.DecodeResult [NBMsgPackAsync]Nerdbank.MessagePack.MessagePackStreamingReader.TrySkip(ref Nerdbank.MessagePack.SerializationContext context) -> Nerdbank.MessagePack.MessagePackPrimitives.DecodeResult +[NBMsgPackAsync]override Nerdbank.MessagePack.MessagePackConverter.SkipToIndexValueAsync(Nerdbank.MessagePack.MessagePackAsyncReader! reader, object? index, Nerdbank.MessagePack.SerializationContext context) -> System.Threading.Tasks.ValueTask +[NBMsgPackAsync]override Nerdbank.MessagePack.MessagePackConverter.SkipToPropertyValueAsync(Nerdbank.MessagePack.MessagePackAsyncReader! reader, PolyType.Abstractions.IPropertyShape! propertyShape, Nerdbank.MessagePack.SerializationContext context) -> System.Threading.Tasks.ValueTask +[NBMsgPackAsync]override sealed Nerdbank.MessagePack.MessagePackConverter.ReadObjectAsync(Nerdbank.MessagePack.MessagePackAsyncReader! reader, Nerdbank.MessagePack.SerializationContext context) -> System.Threading.Tasks.ValueTask +[NBMsgPackAsync]override sealed Nerdbank.MessagePack.MessagePackConverter.WriteObjectAsync(Nerdbank.MessagePack.MessagePackAsyncWriter! writer, object? value, Nerdbank.MessagePack.SerializationContext context) -> System.Threading.Tasks.ValueTask [NBMsgPackAsync]virtual Nerdbank.MessagePack.MessagePackAsyncWriter.SyncWriter.Invoke(ref Nerdbank.MessagePack.MessagePackWriter writer, T state) -> void [NBMsgPackAsync]virtual Nerdbank.MessagePack.MessagePackConverter.ReadAsync(Nerdbank.MessagePack.MessagePackAsyncReader! reader, Nerdbank.MessagePack.SerializationContext context) -> System.Threading.Tasks.ValueTask -[NBMsgPackAsync]virtual Nerdbank.MessagePack.MessagePackConverter.SkipToIndexValueAsync(Nerdbank.MessagePack.MessagePackAsyncReader! reader, object? index, Nerdbank.MessagePack.SerializationContext context) -> System.Threading.Tasks.ValueTask -[NBMsgPackAsync]virtual Nerdbank.MessagePack.MessagePackConverter.SkipToPropertyValueAsync(Nerdbank.MessagePack.MessagePackAsyncReader! reader, PolyType.Abstractions.IPropertyShape! propertyShape, Nerdbank.MessagePack.SerializationContext context) -> System.Threading.Tasks.ValueTask [NBMsgPackAsync]virtual Nerdbank.MessagePack.MessagePackConverter.WriteAsync(Nerdbank.MessagePack.MessagePackAsyncWriter! writer, T? value, Nerdbank.MessagePack.SerializationContext context) -> System.Threading.Tasks.ValueTask [NBMsgPackAsync]virtual Nerdbank.MessagePack.MessagePackStreamingReader.GetMoreBytesAsync.Invoke(object? state, System.SequencePosition consumed, System.SequencePosition examined, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.ValueTask ~override Nerdbank.MessagePack.Extension.Equals(object obj) -> bool diff --git a/src/Nerdbank.MessagePack/netstandard2.0/PublicAPI.Unshipped.txt b/src/Nerdbank.MessagePack/netstandard2.0/PublicAPI.Unshipped.txt index 436ea4fd..418c08f8 100644 --- a/src/Nerdbank.MessagePack/netstandard2.0/PublicAPI.Unshipped.txt +++ b/src/Nerdbank.MessagePack/netstandard2.0/PublicAPI.Unshipped.txt @@ -1,3 +1,7 @@ +abstract Nerdbank.MessagePack.MessagePackConverter.GetJsonSchema(Nerdbank.MessagePack.JsonSchemaContext! context, PolyType.Abstractions.ITypeShape! typeShape) -> System.Text.Json.Nodes.JsonObject? +abstract Nerdbank.MessagePack.MessagePackConverter.PreferAsyncSerialization.get -> bool +abstract Nerdbank.MessagePack.MessagePackConverter.ReadObject(ref Nerdbank.MessagePack.MessagePackReader reader, Nerdbank.MessagePack.SerializationContext context) -> object? +abstract Nerdbank.MessagePack.MessagePackConverter.WriteObject(ref Nerdbank.MessagePack.MessagePackWriter writer, object? value, Nerdbank.MessagePack.SerializationContext context) -> void abstract Nerdbank.MessagePack.MessagePackConverter.Read(ref Nerdbank.MessagePack.MessagePackReader reader, Nerdbank.MessagePack.SerializationContext context) -> T? abstract Nerdbank.MessagePack.MessagePackConverter.Write(ref Nerdbank.MessagePack.MessagePackWriter writer, in T? value, Nerdbank.MessagePack.SerializationContext context) -> void abstract Nerdbank.MessagePack.MessagePackNamingPolicy.ConvertName(string! name) -> string! @@ -69,11 +73,6 @@ Nerdbank.MessagePack.IDeepSecureEqualityComparer Nerdbank.MessagePack.IDeepSecureEqualityComparer.DeepEquals(T? other) -> bool Nerdbank.MessagePack.IDeepSecureEqualityComparer.GetHashCode() -> int Nerdbank.MessagePack.IDeepSecureEqualityComparer.GetSecureHashCode() -> long -Nerdbank.MessagePack.IMessagePackConverter -Nerdbank.MessagePack.IMessagePackConverter.GetJsonSchema(Nerdbank.MessagePack.JsonSchemaContext! context, PolyType.Abstractions.ITypeShape! typeShape) -> System.Text.Json.Nodes.JsonObject? -Nerdbank.MessagePack.IMessagePackConverter.PreferAsyncSerialization.get -> bool -Nerdbank.MessagePack.IMessagePackConverter.Read(ref Nerdbank.MessagePack.MessagePackReader reader, Nerdbank.MessagePack.SerializationContext context) -> object? -Nerdbank.MessagePack.IMessagePackConverter.Write(ref Nerdbank.MessagePack.MessagePackWriter writer, object? value, Nerdbank.MessagePack.SerializationContext context) -> void Nerdbank.MessagePack.IMessagePackSerializationCallbacks Nerdbank.MessagePack.IMessagePackSerializationCallbacks.OnAfterDeserialize() -> void Nerdbank.MessagePack.IMessagePackSerializationCallbacks.OnBeforeSerialize() -> void @@ -97,6 +96,8 @@ Nerdbank.MessagePack.LibraryReservedMessagePackExtensionTypeCode.LibraryReserved Nerdbank.MessagePack.LibraryReservedMessagePackExtensionTypeCode.ObjectReference.get -> sbyte Nerdbank.MessagePack.LibraryReservedMessagePackExtensionTypeCode.ObjectReference.init -> void Nerdbank.MessagePack.MessagePackCode +Nerdbank.MessagePack.MessagePackConverter +Nerdbank.MessagePack.MessagePackConverter.MessagePackConverter() -> void Nerdbank.MessagePack.MessagePackConverter Nerdbank.MessagePack.MessagePackConverter.MessagePackConverter() -> void Nerdbank.MessagePack.MessagePackConverterAttribute @@ -312,8 +313,8 @@ Nerdbank.MessagePack.SerializationContext.CancellationToken.get -> System.Thread Nerdbank.MessagePack.SerializationContext.CancellationToken.init -> void Nerdbank.MessagePack.SerializationContext.DepthStep() -> void Nerdbank.MessagePack.SerializationContext.Equals(Nerdbank.MessagePack.SerializationContext other) -> bool -Nerdbank.MessagePack.SerializationContext.GetConverter(PolyType.Abstractions.ITypeShape! shape) -> Nerdbank.MessagePack.IMessagePackConverter! -Nerdbank.MessagePack.SerializationContext.GetConverter(System.Type! type, PolyType.ITypeShapeProvider? provider) -> Nerdbank.MessagePack.IMessagePackConverter! +Nerdbank.MessagePack.SerializationContext.GetConverter(PolyType.Abstractions.ITypeShape! shape) -> Nerdbank.MessagePack.MessagePackConverter! +Nerdbank.MessagePack.SerializationContext.GetConverter(System.Type! type, PolyType.ITypeShapeProvider? provider) -> Nerdbank.MessagePack.MessagePackConverter! Nerdbank.MessagePack.SerializationContext.GetConverter(PolyType.ITypeShapeProvider? provider) -> Nerdbank.MessagePack.MessagePackConverter! Nerdbank.MessagePack.SerializationContext.MaxDepth.get -> int Nerdbank.MessagePack.SerializationContext.MaxDepth.set -> void @@ -335,6 +336,8 @@ override Nerdbank.MessagePack.ExtensionHeader.GetHashCode() -> int override Nerdbank.MessagePack.LibraryReservedMessagePackExtensionTypeCode.Equals(object? obj) -> bool override Nerdbank.MessagePack.LibraryReservedMessagePackExtensionTypeCode.GetHashCode() -> int override Nerdbank.MessagePack.LibraryReservedMessagePackExtensionTypeCode.ToString() -> string! +override Nerdbank.MessagePack.MessagePackConverter.GetJsonSchema(Nerdbank.MessagePack.JsonSchemaContext! context, PolyType.Abstractions.ITypeShape! typeShape) -> System.Text.Json.Nodes.JsonObject? +override Nerdbank.MessagePack.MessagePackConverter.PreferAsyncSerialization.get -> bool override Nerdbank.MessagePack.MessagePackSerializer.Equals(object? obj) -> bool override Nerdbank.MessagePack.MessagePackSerializer.GetHashCode() -> int override Nerdbank.MessagePack.MessagePackSerializer.ToString() -> string! @@ -344,6 +347,8 @@ override Nerdbank.MessagePack.MessagePackSerializer.StreamingEnumerationOptions< override Nerdbank.MessagePack.MessagePackString.Equals(object? obj) -> bool override Nerdbank.MessagePack.MessagePackString.GetHashCode() -> int override Nerdbank.MessagePack.SerializationContext.GetHashCode() -> int +override sealed Nerdbank.MessagePack.MessagePackConverter.ReadObject(ref Nerdbank.MessagePack.MessagePackReader reader, Nerdbank.MessagePack.SerializationContext context) -> object? +override sealed Nerdbank.MessagePack.MessagePackConverter.WriteObject(ref Nerdbank.MessagePack.MessagePackWriter writer, object? value, Nerdbank.MessagePack.SerializationContext context) -> void static Nerdbank.MessagePack.DecodeResultExtensions.NeedsMoreBytes(this Nerdbank.MessagePack.MessagePackPrimitives.DecodeResult result) -> bool static Nerdbank.MessagePack.Extension.operator !=(Nerdbank.MessagePack.Extension left, Nerdbank.MessagePack.Extension right) -> bool static Nerdbank.MessagePack.Extension.operator ==(Nerdbank.MessagePack.Extension left, Nerdbank.MessagePack.Extension right) -> bool @@ -435,8 +440,6 @@ virtual Nerdbank.MessagePack.LibraryReservedMessagePackExtensionTypeCode. virtual Nerdbank.MessagePack.LibraryReservedMessagePackExtensionTypeCode.EqualityContract.get -> System.Type! virtual Nerdbank.MessagePack.LibraryReservedMessagePackExtensionTypeCode.Equals(Nerdbank.MessagePack.LibraryReservedMessagePackExtensionTypeCode? other) -> bool virtual Nerdbank.MessagePack.LibraryReservedMessagePackExtensionTypeCode.PrintMembers(System.Text.StringBuilder! builder) -> bool -virtual Nerdbank.MessagePack.MessagePackConverter.GetJsonSchema(Nerdbank.MessagePack.JsonSchemaContext! context, PolyType.Abstractions.ITypeShape! typeShape) -> System.Text.Json.Nodes.JsonObject? -virtual Nerdbank.MessagePack.MessagePackConverter.PreferAsyncSerialization.get -> bool virtual Nerdbank.MessagePack.MessagePackSerializer.$() -> Nerdbank.MessagePack.MessagePackSerializer! virtual Nerdbank.MessagePack.MessagePackSerializer.EqualityContract.get -> System.Type! virtual Nerdbank.MessagePack.MessagePackSerializer.Equals(Nerdbank.MessagePack.MessagePackSerializer? other) -> bool @@ -445,10 +448,10 @@ virtual Nerdbank.MessagePack.MessagePackSerializer.StreamingEnumerationOptions.EqualityContract.get -> System.Type! virtual Nerdbank.MessagePack.MessagePackSerializer.StreamingEnumerationOptions.Equals(Nerdbank.MessagePack.MessagePackSerializer.StreamingEnumerationOptions? other) -> bool virtual Nerdbank.MessagePack.MessagePackSerializer.StreamingEnumerationOptions.PrintMembers(System.Text.StringBuilder! builder) -> bool -[NBMsgPackAsync]Nerdbank.MessagePack.IMessagePackConverter.ReadAsync(Nerdbank.MessagePack.MessagePackAsyncReader! reader, Nerdbank.MessagePack.SerializationContext context) -> System.Threading.Tasks.ValueTask -[NBMsgPackAsync]Nerdbank.MessagePack.IMessagePackConverter.SkipToIndexValueAsync(Nerdbank.MessagePack.MessagePackAsyncReader! reader, object? index, Nerdbank.MessagePack.SerializationContext context) -> System.Threading.Tasks.ValueTask -[NBMsgPackAsync]Nerdbank.MessagePack.IMessagePackConverter.SkipToPropertyValueAsync(Nerdbank.MessagePack.MessagePackAsyncReader! reader, PolyType.Abstractions.IPropertyShape! propertyShape, Nerdbank.MessagePack.SerializationContext context) -> System.Threading.Tasks.ValueTask -[NBMsgPackAsync]Nerdbank.MessagePack.IMessagePackConverter.WriteAsync(Nerdbank.MessagePack.MessagePackAsyncWriter! writer, object? value, Nerdbank.MessagePack.SerializationContext context) -> System.Threading.Tasks.ValueTask +[NBMsgPackAsync]abstract Nerdbank.MessagePack.MessagePackConverter.ReadObjectAsync(Nerdbank.MessagePack.MessagePackAsyncReader! reader, Nerdbank.MessagePack.SerializationContext context) -> System.Threading.Tasks.ValueTask +[NBMsgPackAsync]abstract Nerdbank.MessagePack.MessagePackConverter.SkipToIndexValueAsync(Nerdbank.MessagePack.MessagePackAsyncReader! reader, object? index, Nerdbank.MessagePack.SerializationContext context) -> System.Threading.Tasks.ValueTask +[NBMsgPackAsync]abstract Nerdbank.MessagePack.MessagePackConverter.SkipToPropertyValueAsync(Nerdbank.MessagePack.MessagePackAsyncReader! reader, PolyType.Abstractions.IPropertyShape! propertyShape, Nerdbank.MessagePack.SerializationContext context) -> System.Threading.Tasks.ValueTask +[NBMsgPackAsync]abstract Nerdbank.MessagePack.MessagePackConverter.WriteObjectAsync(Nerdbank.MessagePack.MessagePackAsyncWriter! writer, object? value, Nerdbank.MessagePack.SerializationContext context) -> System.Threading.Tasks.ValueTask [NBMsgPackAsync]Nerdbank.MessagePack.MessagePackAsyncReader [NBMsgPackAsync]Nerdbank.MessagePack.MessagePackAsyncReader.BufferNextStructureAsync(Nerdbank.MessagePack.SerializationContext context) -> System.Threading.Tasks.ValueTask [NBMsgPackAsync]Nerdbank.MessagePack.MessagePackAsyncReader.BufferNextStructuresAsync(int minimumDesiredBufferedStructures, int countUpTo, Nerdbank.MessagePack.SerializationContext context) -> System.Threading.Tasks.ValueTask @@ -520,10 +523,12 @@ virtual Nerdbank.MessagePack.MessagePackSerializer.StreamingEnumerationOptions value) -> Nerdbank.MessagePack.MessagePackPrimitives.DecodeResult [NBMsgPackAsync]Nerdbank.MessagePack.MessagePackStreamingReader.TryReadStringSpan(out bool contiguous, out System.ReadOnlySpan value) -> Nerdbank.MessagePack.MessagePackPrimitives.DecodeResult [NBMsgPackAsync]Nerdbank.MessagePack.MessagePackStreamingReader.TrySkip(ref Nerdbank.MessagePack.SerializationContext context) -> Nerdbank.MessagePack.MessagePackPrimitives.DecodeResult +[NBMsgPackAsync]override Nerdbank.MessagePack.MessagePackConverter.SkipToIndexValueAsync(Nerdbank.MessagePack.MessagePackAsyncReader! reader, object? index, Nerdbank.MessagePack.SerializationContext context) -> System.Threading.Tasks.ValueTask +[NBMsgPackAsync]override Nerdbank.MessagePack.MessagePackConverter.SkipToPropertyValueAsync(Nerdbank.MessagePack.MessagePackAsyncReader! reader, PolyType.Abstractions.IPropertyShape! propertyShape, Nerdbank.MessagePack.SerializationContext context) -> System.Threading.Tasks.ValueTask +[NBMsgPackAsync]override sealed Nerdbank.MessagePack.MessagePackConverter.ReadObjectAsync(Nerdbank.MessagePack.MessagePackAsyncReader! reader, Nerdbank.MessagePack.SerializationContext context) -> System.Threading.Tasks.ValueTask +[NBMsgPackAsync]override sealed Nerdbank.MessagePack.MessagePackConverter.WriteObjectAsync(Nerdbank.MessagePack.MessagePackAsyncWriter! writer, object? value, Nerdbank.MessagePack.SerializationContext context) -> System.Threading.Tasks.ValueTask [NBMsgPackAsync]virtual Nerdbank.MessagePack.MessagePackAsyncWriter.SyncWriter.Invoke(ref Nerdbank.MessagePack.MessagePackWriter writer, T state) -> void [NBMsgPackAsync]virtual Nerdbank.MessagePack.MessagePackConverter.ReadAsync(Nerdbank.MessagePack.MessagePackAsyncReader! reader, Nerdbank.MessagePack.SerializationContext context) -> System.Threading.Tasks.ValueTask -[NBMsgPackAsync]virtual Nerdbank.MessagePack.MessagePackConverter.SkipToIndexValueAsync(Nerdbank.MessagePack.MessagePackAsyncReader! reader, object? index, Nerdbank.MessagePack.SerializationContext context) -> System.Threading.Tasks.ValueTask -[NBMsgPackAsync]virtual Nerdbank.MessagePack.MessagePackConverter.SkipToPropertyValueAsync(Nerdbank.MessagePack.MessagePackAsyncReader! reader, PolyType.Abstractions.IPropertyShape! propertyShape, Nerdbank.MessagePack.SerializationContext context) -> System.Threading.Tasks.ValueTask [NBMsgPackAsync]virtual Nerdbank.MessagePack.MessagePackConverter.WriteAsync(Nerdbank.MessagePack.MessagePackAsyncWriter! writer, T? value, Nerdbank.MessagePack.SerializationContext context) -> System.Threading.Tasks.ValueTask [NBMsgPackAsync]virtual Nerdbank.MessagePack.MessagePackStreamingReader.GetMoreBytesAsync.Invoke(object? state, System.SequencePosition consumed, System.SequencePosition examined, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.ValueTask ~override Nerdbank.MessagePack.Extension.Equals(object obj) -> bool diff --git a/test/Nerdbank.MessagePack.Analyzers.Tests/ConverterAnalyzersTests.cs b/test/Nerdbank.MessagePack.Analyzers.Tests/ConverterAnalyzersTests.cs index 45ca85c2..078224d3 100644 --- a/test/Nerdbank.MessagePack.Analyzers.Tests/ConverterAnalyzersTests.cs +++ b/test/Nerdbank.MessagePack.Analyzers.Tests/ConverterAnalyzersTests.cs @@ -230,7 +230,7 @@ public override MyType Read(ref MessagePackReader reader, SerializationContext c { return new MyType { - SomeField = (SomeOtherType)context.GetConverter(typeof(SomeOtherType), null).Read(ref reader, context), + SomeField = (SomeOtherType)context.GetConverter(typeof(SomeOtherType), null).ReadObject(ref reader, context), }; } } @@ -243,7 +243,7 @@ public override void Write(ref MessagePackWriter writer, in MyType value, Serial return; } - context.GetConverter(typeof(SomeOtherType), null).Write(ref writer, value.SomeField, context); + context.GetConverter(typeof(SomeOtherType), null).WriteObject(ref writer, value.SomeField, context); } public override System.Text.Json.Nodes.JsonObject GetJsonSchema(JsonSchemaContext context, PolyType.Abstractions.ITypeShape typeShape) => throw new System.NotImplementedException(); diff --git a/test/Nerdbank.MessagePack.Tests/CustomConverterTests.cs b/test/Nerdbank.MessagePack.Tests/CustomConverterTests.cs index c7621fea..a5d319d1 100644 --- a/test/Nerdbank.MessagePack.Tests/CustomConverterTests.cs +++ b/test/Nerdbank.MessagePack.Tests/CustomConverterTests.cs @@ -98,13 +98,13 @@ private partial class CustomTypeConverterNonGenericTypeShapeProvider : MessagePa { public override CustomType? Read(ref MessagePackReader reader, SerializationContext context) { - string? value = (string?)context.GetConverter(typeof(string), ShapeProvider).Read(ref reader, context); + string? value = (string?)context.GetConverter(typeof(string), ShapeProvider).ReadObject(ref reader, context); return new CustomType { InternalProperty = value }; } public override void Write(ref MessagePackWriter writer, in CustomType? value, SerializationContext context) { - context.GetConverter(typeof(string), ShapeProvider).Write(ref writer, value?.InternalProperty, context); + context.GetConverter(typeof(string), ShapeProvider).WriteObject(ref writer, value?.InternalProperty, context); } } @@ -113,13 +113,13 @@ private partial class CustomTypeConverterNonGenericTypeShape : MessagePackConver { public override CustomType? Read(ref MessagePackReader reader, SerializationContext context) { - string? value = (string?)context.GetConverter(ShapeProvider.GetShape(typeof(string))!).Read(ref reader, context); + string? value = (string?)context.GetConverter(ShapeProvider.GetShape(typeof(string))!).ReadObject(ref reader, context); return new CustomType { InternalProperty = value }; } public override void Write(ref MessagePackWriter writer, in CustomType? value, SerializationContext context) { - context.GetConverter(ShapeProvider.GetShape(typeof(string)!)!).Write(ref writer, value?.InternalProperty, context); + context.GetConverter(ShapeProvider.GetShape(typeof(string)!)!).WriteObject(ref writer, value?.InternalProperty, context); } } From 7cc974ddcaaad3c3b538da913173fe2f85de9055 Mon Sep 17 00:00:00 2001 From: Andrew Arnott Date: Sat, 1 Feb 2025 14:58:56 -0700 Subject: [PATCH 2/2] Remove unnecessary #pragma Closes #248 --- src/Nerdbank.MessagePack/Converters/SubTypeUnionConverter`1.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/Nerdbank.MessagePack/Converters/SubTypeUnionConverter`1.cs b/src/Nerdbank.MessagePack/Converters/SubTypeUnionConverter`1.cs index 5bf09b51..92629926 100644 --- a/src/Nerdbank.MessagePack/Converters/SubTypeUnionConverter`1.cs +++ b/src/Nerdbank.MessagePack/Converters/SubTypeUnionConverter`1.cs @@ -72,7 +72,6 @@ internal SubTypeUnionConverter(SubTypes subTypes, MessagePackConverter ba return (TBase?)converter.ReadObject(ref reader, context); } -#pragma warning disable NBMsgPack031 // Exactly one structure -- it doesn't (yet) see MessagePackConverter.WriteObject calls /// public override void Write(ref MessagePackWriter writer, in TBase? value, SerializationContext context) { @@ -101,7 +100,6 @@ public override void Write(ref MessagePackWriter writer, in TBase? value, Serial throw new MessagePackSerializationException($"value is of type {valueType.FullName} which is not one of those listed via {KnownSubTypeAttribute.TypeName} on the declared base type {typeof(TBase).FullName}."); } } -#pragma warning restore NBMsgPack031 /// [Experimental("NBMsgPackAsync")]