From 877721d77e8df122ffe92933f8365308ec74e300 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juho=20Hanhim=C3=A4ki?= Date: Fri, 19 Jun 2026 15:49:48 +0300 Subject: [PATCH] feat: add 'allows ref struct' support --- .../Compression/BrotliCompressor.cs | 8 ++- .../Formatters/CollectionFormatters.cs | 4 +- .../Formatters/CultureInfoFormatter.cs | 4 +- .../Formatters/DynamicUnionFormatter.cs | 2 +- .../InterfaceCollectionFormatters.cs | 12 +++- .../Formatters/KeyValuePairFormatter.cs | 4 +- src/MemoryPack.Core/IMemoryPackFormatter.cs | 12 +++- src/MemoryPack.Core/IMemoryPackable.cs | 7 ++- .../ReusableLinkedArrayBufferWriter.cs | 4 +- src/MemoryPack.Core/MemoryPack.Core.csproj | 2 +- .../MemoryPackFormatterProvider.cs | 4 +- src/MemoryPack.Core/MemoryPackReader.cs | 2 +- .../MemoryPackSerializer.Deserialize.cs | 10 ++-- .../MemoryPackSerializer.NonGenerics.cs | 8 ++- .../MemoryPackSerializer.Serialize.cs | 8 ++- .../MemoryPackWriter.Unmanaged.cs | 60 +++++++++---------- src/MemoryPack.Core/MemoryPackWriter.cs | 25 ++++++-- .../MemoryPackGenerator.Emitter.cs | 2 +- .../MemoryPackGenerator.Parser.cs | 2 +- .../MemoryPack.Streaming.csproj | 2 +- .../MemoryPack.UnityShims.csproj | 2 +- src/MemoryPack/MemoryPack.csproj | 2 +- .../MemoryPack.Tests/MemoryPack.Tests.csproj | 2 +- tests/MemoryPack.Tests/MethodRefTest.cs | 4 +- tests/MemoryPack.Tests/Models/MethodCall.cs | 16 +++-- 25 files changed, 134 insertions(+), 74 deletions(-) diff --git a/src/MemoryPack.Core/Compression/BrotliCompressor.cs b/src/MemoryPack.Core/Compression/BrotliCompressor.cs index 9279addb..3e614822 100644 --- a/src/MemoryPack.Core/Compression/BrotliCompressor.cs +++ b/src/MemoryPack.Core/Compression/BrotliCompressor.cs @@ -195,7 +195,9 @@ public async ValueTask CopyToAsync(Stream stream, int bufferSize = 65535, Cancel } public void CopyTo(ref MemoryPackWriter memoryPackWriter) -#if NET7_0_OR_GREATER +#if NET9_0_OR_GREATER + where TBufferWriter : IBufferWriter, allows ref struct +#elif NET7_0_OR_GREATER where TBufferWriter : IBufferWriter #else where TBufferWriter : class, IBufferWriter @@ -253,7 +255,9 @@ static int CompressCore(ref BrotliEncoder encoder, ReadOnlySpan(ref BrotliEncoder encoder, ReadOnlySpan source, ref MemoryPackWriter destBufferWriter, int? initialLength, bool isFinalBlock) -#if NET7_0_OR_GREATER +#if NET9_0_OR_GREATER + where TBufferWriter : IBufferWriter, allows ref struct +#elif NET7_0_OR_GREATER where TBufferWriter : IBufferWriter #else where TBufferWriter : class, IBufferWriter diff --git a/src/MemoryPack.Core/Formatters/CollectionFormatters.cs b/src/MemoryPack.Core/Formatters/CollectionFormatters.cs index de6066ed..02efd240 100644 --- a/src/MemoryPack.Core/Formatters/CollectionFormatters.cs +++ b/src/MemoryPack.Core/Formatters/CollectionFormatters.cs @@ -55,7 +55,9 @@ public static class ListFormatter [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void SerializePackable(ref MemoryPackWriter writer, List? value) where T : IMemoryPackable -#if NET7_0_OR_GREATER +#if NET9_0_OR_GREATER + where TBufferWriter : IBufferWriter, allows ref struct +#elif NET7_0_OR_GREATER where TBufferWriter : IBufferWriter #else where TBufferWriter : class, IBufferWriter diff --git a/src/MemoryPack.Core/Formatters/CultureInfoFormatter.cs b/src/MemoryPack.Core/Formatters/CultureInfoFormatter.cs index 0bce09d9..1c9d5113 100644 --- a/src/MemoryPack.Core/Formatters/CultureInfoFormatter.cs +++ b/src/MemoryPack.Core/Formatters/CultureInfoFormatter.cs @@ -1,4 +1,4 @@ -using System.Globalization; +using System.Globalization; using MemoryPack.Internal; namespace MemoryPack.Formatters; @@ -27,4 +27,4 @@ public override void Deserialize(ref MemoryPackReader reader, scoped ref Culture value = CultureInfo.GetCultureInfo(str); } } -} \ No newline at end of file +} diff --git a/src/MemoryPack.Core/Formatters/DynamicUnionFormatter.cs b/src/MemoryPack.Core/Formatters/DynamicUnionFormatter.cs index 691ea320..ca2d2e1d 100644 --- a/src/MemoryPack.Core/Formatters/DynamicUnionFormatter.cs +++ b/src/MemoryPack.Core/Formatters/DynamicUnionFormatter.cs @@ -39,7 +39,7 @@ public override void Deserialize(ref MemoryPackReader reader, scoped ref T? valu value = default; return; } - + if (tagToType.TryGetValue(tag, out var type)) { object? v = value; diff --git a/src/MemoryPack.Core/Formatters/InterfaceCollectionFormatters.cs b/src/MemoryPack.Core/Formatters/InterfaceCollectionFormatters.cs index 6a5d819d..2f95a8e1 100644 --- a/src/MemoryPack.Core/Formatters/InterfaceCollectionFormatters.cs +++ b/src/MemoryPack.Core/Formatters/InterfaceCollectionFormatters.cs @@ -42,7 +42,9 @@ file static class InterfaceCollectionFormatterUtils [MethodImpl(MethodImplOptions.AggressiveInlining)] public static bool TrySerializeOptimized(ref MemoryPackWriter writer, [NotNullWhen(false)] scoped ref TCollection? value) where TCollection : IEnumerable -#if NET7_0_OR_GREATER +#if NET9_0_OR_GREATER + where TBufferWriter : IBufferWriter, allows ref struct +#elif NET7_0_OR_GREATER where TBufferWriter : IBufferWriter #else where TBufferWriter : class, IBufferWriter @@ -75,7 +77,9 @@ public static bool TrySerializeOptimized(r public static void SerializeCollection(ref MemoryPackWriter writer, scoped ref TCollection? value) where TCollection : ICollection -#if NET7_0_OR_GREATER +#if NET9_0_OR_GREATER + where TBufferWriter : IBufferWriter, allows ref struct +#elif NET7_0_OR_GREATER where TBufferWriter : IBufferWriter #else where TBufferWriter : class, IBufferWriter @@ -94,7 +98,9 @@ public static void SerializeCollection(ref public static void SerializeReadOnlyCollection(ref MemoryPackWriter writer, scoped ref TCollection? value) where TCollection : IReadOnlyCollection -#if NET7_0_OR_GREATER +#if NET9_0_OR_GREATER + where TBufferWriter : IBufferWriter, allows ref struct +#elif NET7_0_OR_GREATER where TBufferWriter : IBufferWriter #else where TBufferWriter : class, IBufferWriter diff --git a/src/MemoryPack.Core/Formatters/KeyValuePairFormatter.cs b/src/MemoryPack.Core/Formatters/KeyValuePairFormatter.cs index 936452cb..6b08f172 100644 --- a/src/MemoryPack.Core/Formatters/KeyValuePairFormatter.cs +++ b/src/MemoryPack.Core/Formatters/KeyValuePairFormatter.cs @@ -12,7 +12,9 @@ public static class KeyValuePairFormatter [Preserve] [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void Serialize(IMemoryPackFormatter keyFormatter, IMemoryPackFormatter valueFormatter, ref MemoryPackWriter writer, KeyValuePair value) -#if NET7_0_OR_GREATER +#if NET9_0_OR_GREATER + where TBufferWriter : IBufferWriter, allows ref struct +#elif NET7_0_OR_GREATER where TBufferWriter : IBufferWriter #else where TBufferWriter : class, IBufferWriter diff --git a/src/MemoryPack.Core/IMemoryPackFormatter.cs b/src/MemoryPack.Core/IMemoryPackFormatter.cs index 0ce82e91..976f4c57 100644 --- a/src/MemoryPack.Core/IMemoryPackFormatter.cs +++ b/src/MemoryPack.Core/IMemoryPackFormatter.cs @@ -8,7 +8,9 @@ public interface IMemoryPackFormatter { [Preserve] void Serialize(ref MemoryPackWriter writer, scoped ref object? value) -#if NET7_0_OR_GREATER +#if NET9_0_OR_GREATER + where TBufferWriter : IBufferWriter, allows ref struct; +#elif NET7_0_OR_GREATER where TBufferWriter : IBufferWriter; #else where TBufferWriter : class, IBufferWriter; @@ -22,7 +24,9 @@ public interface IMemoryPackFormatter { [Preserve] void Serialize(ref MemoryPackWriter writer, scoped ref T? value) -#if NET7_0_OR_GREATER +#if NET9_0_OR_GREATER + where TBufferWriter : IBufferWriter, allows ref struct; +#elif NET7_0_OR_GREATER where TBufferWriter : IBufferWriter; #else where TBufferWriter : class, IBufferWriter; @@ -36,7 +40,9 @@ public abstract class MemoryPackFormatter : IMemoryPackFormatter, IMemoryP { [Preserve] public abstract void Serialize(ref MemoryPackWriter writer, scoped ref T? value) -#if NET7_0_OR_GREATER +#if NET9_0_OR_GREATER + where TBufferWriter : IBufferWriter, allows ref struct; +#elif NET7_0_OR_GREATER where TBufferWriter : IBufferWriter; #else where TBufferWriter : class, IBufferWriter; diff --git a/src/MemoryPack.Core/IMemoryPackable.cs b/src/MemoryPack.Core/IMemoryPackable.cs index ed228006..9f206437 100644 --- a/src/MemoryPack.Core/IMemoryPackable.cs +++ b/src/MemoryPack.Core/IMemoryPackable.cs @@ -22,8 +22,11 @@ public interface IMemoryPackable : IMemoryPackFormatterRegister { // note: serialize parameter should be `ref readonly` but current lang spec can not. // see proposal https://github.com/dotnet/csharplang/issues/6010 - -#if NET7_0_OR_GREATER +#if NET9_0_OR_GREATER + static abstract void Serialize(ref MemoryPackWriter writer, scoped ref T? value) + where TBufferWriter : IBufferWriter, allows ref struct; + static abstract void Deserialize(ref MemoryPackReader reader, scoped ref T? value); +#elif NET7_0_OR_GREATER static abstract void Serialize(ref MemoryPackWriter writer, scoped ref T? value) where TBufferWriter : IBufferWriter; static abstract void Deserialize(ref MemoryPackReader reader, scoped ref T? value); diff --git a/src/MemoryPack.Core/Internal/ReusableLinkedArrayBufferWriter.cs b/src/MemoryPack.Core/Internal/ReusableLinkedArrayBufferWriter.cs index fed0670b..d6caa9e6 100644 --- a/src/MemoryPack.Core/Internal/ReusableLinkedArrayBufferWriter.cs +++ b/src/MemoryPack.Core/Internal/ReusableLinkedArrayBufferWriter.cs @@ -165,7 +165,9 @@ public byte[] ToArrayAndReset() } public void WriteToAndReset(ref MemoryPackWriter writer) -#if NET7_0_OR_GREATER +#if NET9_0_OR_GREATER + where TBufferWriter : IBufferWriter, allows ref struct +#elif NET7_0_OR_GREATER where TBufferWriter : IBufferWriter #else where TBufferWriter : class, IBufferWriter diff --git a/src/MemoryPack.Core/MemoryPack.Core.csproj b/src/MemoryPack.Core/MemoryPack.Core.csproj index c3d8e842..024c67e4 100644 --- a/src/MemoryPack.Core/MemoryPack.Core.csproj +++ b/src/MemoryPack.Core/MemoryPack.Core.csproj @@ -1,7 +1,7 @@  - net7.0;net8.0;netstandard2.1 + net7.0;net8.0;net9.0;netstandard2.1 enable enable True diff --git a/src/MemoryPack.Core/MemoryPackFormatterProvider.cs b/src/MemoryPack.Core/MemoryPackFormatterProvider.cs index cc762251..beddae09 100644 --- a/src/MemoryPack.Core/MemoryPackFormatterProvider.cs +++ b/src/MemoryPack.Core/MemoryPackFormatterProvider.cs @@ -372,7 +372,9 @@ public ErrorMemoryPackFormatter(Type type, string message) } public void Serialize(ref MemoryPackWriter writer, scoped ref object? value) -#if NET7_0_OR_GREATER +#if NET9_0_OR_GREATER + where TBufferWriter : IBufferWriter, allows ref struct +#elif NET7_0_OR_GREATER where TBufferWriter : IBufferWriter #else where TBufferWriter : class, IBufferWriter diff --git a/src/MemoryPack.Core/MemoryPackReader.cs b/src/MemoryPack.Core/MemoryPackReader.cs index e72d153e..d09c7022 100644 --- a/src/MemoryPack.Core/MemoryPackReader.cs +++ b/src/MemoryPack.Core/MemoryPackReader.cs @@ -796,7 +796,7 @@ public unsafe void DangerousReadUnmanagedSpan(scoped ref Span value) var byteCount = length * Unsafe.SizeOf(); ref var src = ref GetSpanReference(byteCount); - if (value == null || value.Length != length) + if (value.IsEmpty || value.Length != length) { value = AllocateUninitializedArray(length); } diff --git a/src/MemoryPack.Core/MemoryPackSerializer.Deserialize.cs b/src/MemoryPack.Core/MemoryPackSerializer.Deserialize.cs index 6325523e..346ab3d6 100644 --- a/src/MemoryPack.Core/MemoryPackSerializer.Deserialize.cs +++ b/src/MemoryPack.Core/MemoryPackSerializer.Deserialize.cs @@ -15,7 +15,7 @@ public static T? Deserialize< #if NET5_0_OR_GREATER [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] #endif - T>(ReadOnlySpan buffer, MemoryPackSerializerOptions? options = default) + T>(ReadOnlySpan buffer, MemoryPackSerializerOptions? options = default) { T? value = default; Deserialize(buffer, ref value, options); @@ -26,7 +26,7 @@ public static int Deserialize< #if NET5_0_OR_GREATER [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] #endif - T>(ReadOnlySpan buffer, ref T? value, MemoryPackSerializerOptions? options = default) + T>(ReadOnlySpan buffer, ref T? value, MemoryPackSerializerOptions? options = default) { if (!RuntimeHelpers.IsReferenceOrContainsReferences()) { @@ -62,7 +62,7 @@ public static T? Deserialize< #if NET5_0_OR_GREATER [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] #endif - T>(in ReadOnlySequence buffer, MemoryPackSerializerOptions? options = default) + T>(in ReadOnlySequence buffer, MemoryPackSerializerOptions? options = default) { T? value = default; Deserialize(buffer, ref value, options); @@ -73,7 +73,7 @@ public static int Deserialize< #if NET5_0_OR_GREATER [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] #endif - T>(in ReadOnlySequence buffer, ref T? value, MemoryPackSerializerOptions? options = default) + T>(in ReadOnlySequence buffer, ref T? value, MemoryPackSerializerOptions? options = default) { if (!RuntimeHelpers.IsReferenceOrContainsReferences()) { @@ -144,7 +144,7 @@ public static async ValueTask DeserializeAsync< #if NET5_0_OR_GREATER [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] #endif - T>(Stream stream, MemoryPackSerializerOptions? options = default, CancellationToken cancellationToken = default) + T>(Stream stream, MemoryPackSerializerOptions? options = default, CancellationToken cancellationToken = default) { if (stream is MemoryStream ms && ms.TryGetBuffer(out ArraySegment streamBuffer)) { diff --git a/src/MemoryPack.Core/MemoryPackSerializer.NonGenerics.cs b/src/MemoryPack.Core/MemoryPackSerializer.NonGenerics.cs index 5e226f9f..90d704a8 100644 --- a/src/MemoryPack.Core/MemoryPackSerializer.NonGenerics.cs +++ b/src/MemoryPack.Core/MemoryPackSerializer.NonGenerics.cs @@ -32,7 +32,9 @@ public static byte[] Serialize(Type type, object? value, MemoryPackSerializerOpt } public static unsafe void Serialize(Type type, in TBufferWriter bufferWriter, object? value, MemoryPackSerializerOptions? options = default) -#if NET7_0_OR_GREATER +#if NET9_0_OR_GREATER + where TBufferWriter : IBufferWriter, allows ref struct +#elif NET7_0_OR_GREATER where TBufferWriter : IBufferWriter #else where TBufferWriter : class, IBufferWriter @@ -58,7 +60,9 @@ public static unsafe void Serialize(Type type, in TBufferWriter b [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void Serialize(Type type, ref MemoryPackWriter writer, object? value) -#if NET7_0_OR_GREATER +#if NET9_0_OR_GREATER + where TBufferWriter : IBufferWriter, allows ref struct +#elif NET7_0_OR_GREATER where TBufferWriter : IBufferWriter #else where TBufferWriter : class, IBufferWriter diff --git a/src/MemoryPack.Core/MemoryPackSerializer.Serialize.cs b/src/MemoryPack.Core/MemoryPackSerializer.Serialize.cs index 73f1d3f7..3148f5a8 100644 --- a/src/MemoryPack.Core/MemoryPackSerializer.Serialize.cs +++ b/src/MemoryPack.Core/MemoryPackSerializer.Serialize.cs @@ -86,7 +86,9 @@ public static byte[] Serialize(in T? value, MemoryPackSerializerOptions? opti } public static unsafe void Serialize(in TBufferWriter bufferWriter, in T? value, MemoryPackSerializerOptions? options = default) -#if NET7_0_OR_GREATER +#if NET9_0_OR_GREATER + where TBufferWriter : IBufferWriter, allows ref struct +#elif NET7_0_OR_GREATER where TBufferWriter : IBufferWriter #else where TBufferWriter : class, IBufferWriter @@ -154,7 +156,9 @@ public static unsafe void Serialize(in TBufferWriter bufferWri [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void Serialize(ref MemoryPackWriter writer, in T? value) -#if NET7_0_OR_GREATER +#if NET9_0_OR_GREATER + where TBufferWriter : IBufferWriter, allows ref struct +#elif NET7_0_OR_GREATER where TBufferWriter : IBufferWriter #else where TBufferWriter : class, IBufferWriter diff --git a/src/MemoryPack.Core/MemoryPackWriter.Unmanaged.cs b/src/MemoryPack.Core/MemoryPackWriter.Unmanaged.cs index ec935adf..435f68e3 100644 --- a/src/MemoryPack.Core/MemoryPackWriter.Unmanaged.cs +++ b/src/MemoryPack.Core/MemoryPackWriter.Unmanaged.cs @@ -15,7 +15,7 @@ public void WriteUnmanaged(scoped in T1 value1) Unsafe.WriteUnaligned(ref spanRef, value1); Advance(size); } - + [MethodImpl(MethodImplOptions.AggressiveInlining)] public void WriteUnmanagedWithObjectHeader(byte propertyCount, scoped in T1 value1) where T1 : unmanaged @@ -38,7 +38,7 @@ public void WriteUnmanaged(scoped in T1 value1, scoped in T2 value2) Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf()), value2); Advance(size); } - + [MethodImpl(MethodImplOptions.AggressiveInlining)] public void WriteUnmanagedWithObjectHeader(byte propertyCount, scoped in T1 value1, scoped in T2 value2) where T1 : unmanaged @@ -65,7 +65,7 @@ public void WriteUnmanaged(scoped in T1 value1, scoped in T2 value2, Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf()), value3); Advance(size); } - + [MethodImpl(MethodImplOptions.AggressiveInlining)] public void WriteUnmanagedWithObjectHeader(byte propertyCount, scoped in T1 value1, scoped in T2 value2, scoped in T3 value3) where T1 : unmanaged @@ -96,7 +96,7 @@ public void WriteUnmanaged(scoped in T1 value1, scoped in T2 val Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value4); Advance(size); } - + [MethodImpl(MethodImplOptions.AggressiveInlining)] public void WriteUnmanagedWithObjectHeader(byte propertyCount, scoped in T1 value1, scoped in T2 value2, scoped in T3 value3, scoped in T4 value4) where T1 : unmanaged @@ -131,7 +131,7 @@ public void WriteUnmanaged(scoped in T1 value1, scoped in T2 Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value5); Advance(size); } - + [MethodImpl(MethodImplOptions.AggressiveInlining)] public void WriteUnmanagedWithObjectHeader(byte propertyCount, scoped in T1 value1, scoped in T2 value2, scoped in T3 value3, scoped in T4 value4, scoped in T5 value5) where T1 : unmanaged @@ -170,7 +170,7 @@ public void WriteUnmanaged(scoped in T1 value1, scoped i Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value6); Advance(size); } - + [MethodImpl(MethodImplOptions.AggressiveInlining)] public void WriteUnmanagedWithObjectHeader(byte propertyCount, scoped in T1 value1, scoped in T2 value2, scoped in T3 value3, scoped in T4 value4, scoped in T5 value5, scoped in T6 value6) where T1 : unmanaged @@ -213,7 +213,7 @@ public void WriteUnmanaged(scoped in T1 value1, scop Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value7); Advance(size); } - + [MethodImpl(MethodImplOptions.AggressiveInlining)] public void WriteUnmanagedWithObjectHeader(byte propertyCount, scoped in T1 value1, scoped in T2 value2, scoped in T3 value3, scoped in T4 value4, scoped in T5 value5, scoped in T6 value6, scoped in T7 value7) where T1 : unmanaged @@ -260,7 +260,7 @@ public void WriteUnmanaged(scoped in T1 value1, Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value8); Advance(size); } - + [MethodImpl(MethodImplOptions.AggressiveInlining)] public void WriteUnmanagedWithObjectHeader(byte propertyCount, scoped in T1 value1, scoped in T2 value2, scoped in T3 value3, scoped in T4 value4, scoped in T5 value5, scoped in T6 value6, scoped in T7 value7, scoped in T8 value8) where T1 : unmanaged @@ -311,7 +311,7 @@ public void WriteUnmanaged(scoped in T1 valu Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value9); Advance(size); } - + [MethodImpl(MethodImplOptions.AggressiveInlining)] public void WriteUnmanagedWithObjectHeader(byte propertyCount, scoped in T1 value1, scoped in T2 value2, scoped in T3 value3, scoped in T4 value4, scoped in T5 value5, scoped in T6 value6, scoped in T7 value7, scoped in T8 value8, scoped in T9 value9) where T1 : unmanaged @@ -366,7 +366,7 @@ public void WriteUnmanaged(scoped in T1 Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value10); Advance(size); } - + [MethodImpl(MethodImplOptions.AggressiveInlining)] public void WriteUnmanagedWithObjectHeader(byte propertyCount, scoped in T1 value1, scoped in T2 value2, scoped in T3 value3, scoped in T4 value4, scoped in T5 value5, scoped in T6 value6, scoped in T7 value7, scoped in T8 value8, scoped in T9 value9, scoped in T10 value10) where T1 : unmanaged @@ -425,7 +425,7 @@ public void WriteUnmanaged(scoped Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value11); Advance(size); } - + [MethodImpl(MethodImplOptions.AggressiveInlining)] public void WriteUnmanagedWithObjectHeader(byte propertyCount, scoped in T1 value1, scoped in T2 value2, scoped in T3 value3, scoped in T4 value4, scoped in T5 value5, scoped in T6 value6, scoped in T7 value7, scoped in T8 value8, scoped in T9 value9, scoped in T10 value10, scoped in T11 value11) where T1 : unmanaged @@ -488,7 +488,7 @@ public void WriteUnmanaged(sc Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value12); Advance(size); } - + [MethodImpl(MethodImplOptions.AggressiveInlining)] public void WriteUnmanagedWithObjectHeader(byte propertyCount, scoped in T1 value1, scoped in T2 value2, scoped in T3 value3, scoped in T4 value4, scoped in T5 value5, scoped in T6 value6, scoped in T7 value7, scoped in T8 value8, scoped in T9 value9, scoped in T10 value10, scoped in T11 value11, scoped in T12 value12) where T1 : unmanaged @@ -555,7 +555,7 @@ public void WriteUnmanaged() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value13); Advance(size); } - + [MethodImpl(MethodImplOptions.AggressiveInlining)] public void WriteUnmanagedWithObjectHeader(byte propertyCount, scoped in T1 value1, scoped in T2 value2, scoped in T3 value3, scoped in T4 value4, scoped in T5 value5, scoped in T6 value6, scoped in T7 value7, scoped in T8 value8, scoped in T9 value9, scoped in T10 value10, scoped in T11 value11, scoped in T12 value12, scoped in T13 value13) where T1 : unmanaged @@ -626,7 +626,7 @@ public void WriteUnmanaged() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value14); Advance(size); } - + [MethodImpl(MethodImplOptions.AggressiveInlining)] public void WriteUnmanagedWithObjectHeader(byte propertyCount, scoped in T1 value1, scoped in T2 value2, scoped in T3 value3, scoped in T4 value4, scoped in T5 value5, scoped in T6 value6, scoped in T7 value7, scoped in T8 value8, scoped in T9 value9, scoped in T10 value10, scoped in T11 value11, scoped in T12 value12, scoped in T13 value13, scoped in T14 value14) where T1 : unmanaged @@ -701,7 +701,7 @@ public void WriteUnmanaged() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value15); Advance(size); } - + [MethodImpl(MethodImplOptions.AggressiveInlining)] public void WriteUnmanagedWithObjectHeader(byte propertyCount, scoped in T1 value1, scoped in T2 value2, scoped in T3 value3, scoped in T4 value4, scoped in T5 value5, scoped in T6 value6, scoped in T7 value7, scoped in T8 value8, scoped in T9 value9, scoped in T10 value10, scoped in T11 value11, scoped in T12 value12, scoped in T13 value13, scoped in T14 value14, scoped in T15 value15) where T1 : unmanaged @@ -749,7 +749,7 @@ public void DangerousWriteUnmanaged(scoped in T1 value1) Unsafe.WriteUnaligned(ref spanRef, value1); Advance(size); } - + [MethodImpl(MethodImplOptions.AggressiveInlining)] public void DangerousWriteUnmanagedWithObjectHeader(byte propertyCount, scoped in T1 value1) { @@ -769,7 +769,7 @@ public void DangerousWriteUnmanaged(scoped in T1 value1, scoped in T2 va Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf()), value2); Advance(size); } - + [MethodImpl(MethodImplOptions.AggressiveInlining)] public void DangerousWriteUnmanagedWithObjectHeader(byte propertyCount, scoped in T1 value1, scoped in T2 value2) { @@ -791,7 +791,7 @@ public void DangerousWriteUnmanaged(scoped in T1 value1, scoped in T Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf()), value3); Advance(size); } - + [MethodImpl(MethodImplOptions.AggressiveInlining)] public void DangerousWriteUnmanagedWithObjectHeader(byte propertyCount, scoped in T1 value1, scoped in T2 value2, scoped in T3 value3) { @@ -815,7 +815,7 @@ public void DangerousWriteUnmanaged(scoped in T1 value1, scoped Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value4); Advance(size); } - + [MethodImpl(MethodImplOptions.AggressiveInlining)] public void DangerousWriteUnmanagedWithObjectHeader(byte propertyCount, scoped in T1 value1, scoped in T2 value2, scoped in T3 value3, scoped in T4 value4) { @@ -841,7 +841,7 @@ public void DangerousWriteUnmanaged(scoped in T1 value1, sco Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value5); Advance(size); } - + [MethodImpl(MethodImplOptions.AggressiveInlining)] public void DangerousWriteUnmanagedWithObjectHeader(byte propertyCount, scoped in T1 value1, scoped in T2 value2, scoped in T3 value3, scoped in T4 value4, scoped in T5 value5) { @@ -869,7 +869,7 @@ public void DangerousWriteUnmanaged(scoped in T1 value1, Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value6); Advance(size); } - + [MethodImpl(MethodImplOptions.AggressiveInlining)] public void DangerousWriteUnmanagedWithObjectHeader(byte propertyCount, scoped in T1 value1, scoped in T2 value2, scoped in T3 value3, scoped in T4 value4, scoped in T5 value5, scoped in T6 value6) { @@ -899,7 +899,7 @@ public void DangerousWriteUnmanaged(scoped in T1 val Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value7); Advance(size); } - + [MethodImpl(MethodImplOptions.AggressiveInlining)] public void DangerousWriteUnmanagedWithObjectHeader(byte propertyCount, scoped in T1 value1, scoped in T2 value2, scoped in T3 value3, scoped in T4 value4, scoped in T5 value5, scoped in T6 value6, scoped in T7 value7) { @@ -931,7 +931,7 @@ public void DangerousWriteUnmanaged(scoped in T1 Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value8); Advance(size); } - + [MethodImpl(MethodImplOptions.AggressiveInlining)] public void DangerousWriteUnmanagedWithObjectHeader(byte propertyCount, scoped in T1 value1, scoped in T2 value2, scoped in T3 value3, scoped in T4 value4, scoped in T5 value5, scoped in T6 value6, scoped in T7 value7, scoped in T8 value8) { @@ -965,7 +965,7 @@ public void DangerousWriteUnmanaged(scoped i Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value9); Advance(size); } - + [MethodImpl(MethodImplOptions.AggressiveInlining)] public void DangerousWriteUnmanagedWithObjectHeader(byte propertyCount, scoped in T1 value1, scoped in T2 value2, scoped in T3 value3, scoped in T4 value4, scoped in T5 value5, scoped in T6 value6, scoped in T7 value7, scoped in T8 value8, scoped in T9 value9) { @@ -1001,7 +1001,7 @@ public void DangerousWriteUnmanaged(sco Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value10); Advance(size); } - + [MethodImpl(MethodImplOptions.AggressiveInlining)] public void DangerousWriteUnmanagedWithObjectHeader(byte propertyCount, scoped in T1 value1, scoped in T2 value2, scoped in T3 value3, scoped in T4 value4, scoped in T5 value5, scoped in T6 value6, scoped in T7 value7, scoped in T8 value8, scoped in T9 value9, scoped in T10 value10) { @@ -1039,7 +1039,7 @@ public void DangerousWriteUnmanaged() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value11); Advance(size); } - + [MethodImpl(MethodImplOptions.AggressiveInlining)] public void DangerousWriteUnmanagedWithObjectHeader(byte propertyCount, scoped in T1 value1, scoped in T2 value2, scoped in T3 value3, scoped in T4 value4, scoped in T5 value5, scoped in T6 value6, scoped in T7 value7, scoped in T8 value8, scoped in T9 value9, scoped in T10 value10, scoped in T11 value11) { @@ -1079,7 +1079,7 @@ public void DangerousWriteUnmanaged() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value12); Advance(size); } - + [MethodImpl(MethodImplOptions.AggressiveInlining)] public void DangerousWriteUnmanagedWithObjectHeader(byte propertyCount, scoped in T1 value1, scoped in T2 value2, scoped in T3 value3, scoped in T4 value4, scoped in T5 value5, scoped in T6 value6, scoped in T7 value7, scoped in T8 value8, scoped in T9 value9, scoped in T10 value10, scoped in T11 value11, scoped in T12 value12) { @@ -1121,7 +1121,7 @@ public void DangerousWriteUnmanaged() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value13); Advance(size); } - + [MethodImpl(MethodImplOptions.AggressiveInlining)] public void DangerousWriteUnmanagedWithObjectHeader(byte propertyCount, scoped in T1 value1, scoped in T2 value2, scoped in T3 value3, scoped in T4 value4, scoped in T5 value5, scoped in T6 value6, scoped in T7 value7, scoped in T8 value8, scoped in T9 value9, scoped in T10 value10, scoped in T11 value11, scoped in T12 value12, scoped in T13 value13) { @@ -1165,7 +1165,7 @@ public void DangerousWriteUnmanaged() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value14); Advance(size); } - + [MethodImpl(MethodImplOptions.AggressiveInlining)] public void DangerousWriteUnmanagedWithObjectHeader(byte propertyCount, scoped in T1 value1, scoped in T2 value2, scoped in T3 value3, scoped in T4 value4, scoped in T5 value5, scoped in T6 value6, scoped in T7 value7, scoped in T8 value8, scoped in T9 value9, scoped in T10 value10, scoped in T11 value11, scoped in T12 value12, scoped in T13 value13, scoped in T14 value14) { @@ -1211,7 +1211,7 @@ public void DangerousWriteUnmanaged() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value15); Advance(size); } - + [MethodImpl(MethodImplOptions.AggressiveInlining)] public void DangerousWriteUnmanagedWithObjectHeader(byte propertyCount, scoped in T1 value1, scoped in T2 value2, scoped in T3 value3, scoped in T4 value4, scoped in T5 value5, scoped in T6 value6, scoped in T7 value7, scoped in T8 value8, scoped in T9 value9, scoped in T10 value10, scoped in T11 value11, scoped in T12 value12, scoped in T13 value13, scoped in T14 value14, scoped in T15 value15) { diff --git a/src/MemoryPack.Core/MemoryPackWriter.cs b/src/MemoryPack.Core/MemoryPackWriter.cs index 08f4a3ae..433970ec 100644 --- a/src/MemoryPack.Core/MemoryPackWriter.cs +++ b/src/MemoryPack.Core/MemoryPackWriter.cs @@ -16,7 +16,9 @@ namespace MemoryPack; [StructLayout(LayoutKind.Auto)] public ref partial struct MemoryPackWriter -#if NET7_0_OR_GREATER +#if NET9_0_OR_GREATER + where TBufferWriter : IBufferWriter, allows ref struct +#elif NET7_0_OR_GREATER where TBufferWriter : IBufferWriter #else where TBufferWriter : class, IBufferWriter @@ -24,7 +26,11 @@ public ref partial struct MemoryPackWriter { const int DepthLimit = 1000; -#if NET7_0_OR_GREATER +#if NET9_0_OR_GREATER + ref byte bufferWriterRef; + ref TBufferWriter bufferWriter => ref Unsafe.As(ref bufferWriterRef); + ref byte bufferReference; +#elif NET7_0_OR_GREATER ref TBufferWriter bufferWriter; ref byte bufferReference; #else @@ -45,7 +51,10 @@ public ref partial struct MemoryPackWriter public MemoryPackWriter(ref TBufferWriter writer, MemoryPackWriterOptionalState optionalState) { -#if NET7_0_OR_GREATER +#if NET9_0_OR_GREATER + this.bufferWriterRef = ref Unsafe.As(ref writer); + this.bufferReference = ref Unsafe.NullRef(); +#elif NET7_0_OR_GREATER this.bufferWriter = ref writer; this.bufferReference = ref Unsafe.NullRef(); #else @@ -63,7 +72,10 @@ public MemoryPackWriter(ref TBufferWriter writer, MemoryPackWriterOptionalState // optimized ctor, avoid first GetSpan call if we can. public MemoryPackWriter(ref TBufferWriter writer, byte[] firstBufferOfWriter, MemoryPackWriterOptionalState optionalState) { -#if NET7_0_OR_GREATER +#if NET9_0_OR_GREATER + this.bufferWriterRef = ref Unsafe.As(ref writer); + this.bufferReference = ref GetArrayDataReference(firstBufferOfWriter); +#elif NET7_0_OR_GREATER this.bufferWriter = ref writer; this.bufferReference = ref GetArrayDataReference(firstBufferOfWriter); #else @@ -80,7 +92,10 @@ public MemoryPackWriter(ref TBufferWriter writer, byte[] firstBufferOfWriter, Me public MemoryPackWriter(ref TBufferWriter writer, Span firstBufferOfWriter, MemoryPackWriterOptionalState optionalState) { -#if NET7_0_OR_GREATER +#if NET9_0_OR_GREATER + this.bufferWriterRef = ref Unsafe.As(ref writer); + this.bufferReference = ref MemoryMarshal.GetReference(firstBufferOfWriter); +#elif NET7_0_OR_GREATER this.bufferWriter = ref writer; this.bufferReference = ref MemoryMarshal.GetReference(firstBufferOfWriter); #else diff --git a/src/MemoryPack.Generator/MemoryPackGenerator.Emitter.cs b/src/MemoryPack.Generator/MemoryPackGenerator.Emitter.cs index d17735fa..8597c298 100644 --- a/src/MemoryPack.Generator/MemoryPackGenerator.Emitter.cs +++ b/src/MemoryPack.Generator/MemoryPackGenerator.Emitter.cs @@ -455,7 +455,7 @@ public override void Deserialize(ref MemoryPackReader reader, {{scopedRef}} {{Ty writer.AppendLine(code); } - for(int i = 0; i < containingTypeDeclarations.Count; ++i) + for (int i = 0; i < containingTypeDeclarations.Count; ++i) { writer.AppendLine("}"); } diff --git a/src/MemoryPack.Generator/MemoryPackGenerator.Parser.cs b/src/MemoryPack.Generator/MemoryPackGenerator.Parser.cs index 0806cd14..ff33e10a 100644 --- a/src/MemoryPack.Generator/MemoryPackGenerator.Parser.cs +++ b/src/MemoryPack.Generator/MemoryPackGenerator.Parser.cs @@ -529,7 +529,7 @@ public bool Validate(TypeDeclarationSyntax syntax, IGeneratorContext context, bo } } - // Union validations + // Union validations UNION_VALIDATIONS: if (IsUnion) { diff --git a/src/MemoryPack.Streaming/MemoryPack.Streaming.csproj b/src/MemoryPack.Streaming/MemoryPack.Streaming.csproj index a7d0c209..db75cac8 100644 --- a/src/MemoryPack.Streaming/MemoryPack.Streaming.csproj +++ b/src/MemoryPack.Streaming/MemoryPack.Streaming.csproj @@ -1,7 +1,7 @@  - net7.0;netstandard2.1 + net7.0;net8.0;net9.0;netstandard2.1 enable enable $(NoWarn);CS1591;CA2255 diff --git a/src/MemoryPack.UnityShims/MemoryPack.UnityShims.csproj b/src/MemoryPack.UnityShims/MemoryPack.UnityShims.csproj index 7ac25d91..615b4480 100644 --- a/src/MemoryPack.UnityShims/MemoryPack.UnityShims.csproj +++ b/src/MemoryPack.UnityShims/MemoryPack.UnityShims.csproj @@ -1,7 +1,7 @@  - net7.0;net8.0;netstandard2.1 + net7.0;net8.0;net9.0;netstandard2.1 enable enable True diff --git a/src/MemoryPack/MemoryPack.csproj b/src/MemoryPack/MemoryPack.csproj index 76774794..99bc6ac5 100644 --- a/src/MemoryPack/MemoryPack.csproj +++ b/src/MemoryPack/MemoryPack.csproj @@ -1,7 +1,7 @@ - net7.0;net8.0;netstandard2.1 + net7.0;net8.0;net9.0;netstandard2.1 false true diff --git a/tests/MemoryPack.Tests/MemoryPack.Tests.csproj b/tests/MemoryPack.Tests/MemoryPack.Tests.csproj index 313cbe3e..e68774b4 100644 --- a/tests/MemoryPack.Tests/MemoryPack.Tests.csproj +++ b/tests/MemoryPack.Tests/MemoryPack.Tests.csproj @@ -1,7 +1,7 @@  - net8.0 + net8.0;net9.0 enable true diff --git a/tests/MemoryPack.Tests/MethodRefTest.cs b/tests/MemoryPack.Tests/MethodRefTest.cs index 08098367..86c15a53 100644 --- a/tests/MemoryPack.Tests/MethodRefTest.cs +++ b/tests/MemoryPack.Tests/MethodRefTest.cs @@ -51,7 +51,9 @@ public partial class EmitIdData [MemoryPackOnSerializing] static void WriteId(ref MemoryPackWriter writer, ref EmitIdData? value) -#if NET7_0_OR_GREATER +#if NET9_0_OR_GREATER + where TBufferWriter : IBufferWriter, allows ref struct +#elif NET7_0_OR_GREATER where TBufferWriter : IBufferWriter #else where TBufferWriter : class, IBufferWriter diff --git a/tests/MemoryPack.Tests/Models/MethodCall.cs b/tests/MemoryPack.Tests/Models/MethodCall.cs index ebf37c75..012a6238 100644 --- a/tests/MemoryPack.Tests/Models/MethodCall.cs +++ b/tests/MemoryPack.Tests/Models/MethodCall.cs @@ -96,7 +96,9 @@ public void OnDeserialized2() [MemoryPackOnSerializing] public static void OnSerializing_M1(ref MemoryPackWriter writer, ref MethodCall? value) -#if NET7_0_OR_GREATER +#if NET9_0_OR_GREATER + where TBufferWriter : IBufferWriter, allows ref struct +#elif NET7_0_OR_GREATER where TBufferWriter : IBufferWriter #else where TBufferWriter : class, IBufferWriter @@ -107,7 +109,9 @@ public static void OnSerializing_M1(ref MemoryPackWriter(ref MemoryPackWriter writer, ref MethodCall? value) -#if NET7_0_OR_GREATER +#if NET9_0_OR_GREATER + where TBufferWriter : IBufferWriter, allows ref struct +#elif NET7_0_OR_GREATER where TBufferWriter : IBufferWriter #else where TBufferWriter : class, IBufferWriter @@ -118,7 +122,9 @@ public void OnSerializing_M2(ref MemoryPackWriter [MemoryPackOnSerialized] public static void OnSerialized_M1(ref MemoryPackWriter writer, ref MethodCall? value) -#if NET7_0_OR_GREATER +#if NET9_0_OR_GREATER + where TBufferWriter : IBufferWriter, allows ref struct +#elif NET7_0_OR_GREATER where TBufferWriter : IBufferWriter #else where TBufferWriter : class, IBufferWriter @@ -130,7 +136,9 @@ public static void OnSerialized_M1(ref MemoryPackWriter(ref MemoryPackWriter writer, ref MethodCall? value) -#if NET7_0_OR_GREATER +#if NET9_0_OR_GREATER + where TBufferWriter : IBufferWriter, allows ref struct +#elif NET7_0_OR_GREATER where TBufferWriter : IBufferWriter #else where TBufferWriter : class, IBufferWriter