Skip to content

Commit 67bfc1e

Browse files
committed
fix MemoryPackSerializer.SerializeAsync(Type, Stream, object value) fail
1 parent 18bb2b7 commit 67bfc1e

File tree

3 files changed

+51
-3
lines changed

3 files changed

+51
-3
lines changed

src/MemoryPack.Core/MemoryPackSerializer.NonGenerics.cs

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ public static async ValueTask SerializeAsync(Type type, Stream stream, object? v
7373
var tempWriter = ReusableLinkedArrayBufferWriterPool.Rent();
7474
try
7575
{
76-
Serialize(tempWriter, value, options);
76+
SerializeToTempWriter(tempWriter, type, value, options);
7777
await tempWriter.WriteToAndResetAsync(stream, cancellationToken).ConfigureAwait(false);
7878
}
7979
finally
@@ -82,6 +82,20 @@ public static async ValueTask SerializeAsync(Type type, Stream stream, object? v
8282
}
8383
}
8484

85+
static void SerializeToTempWriter(ReusableLinkedArrayBufferWriter bufferWriter, Type type, object? value, MemoryPackSerializerOptions? options)
86+
{
87+
var state = threadStaticWriterOptionalState;
88+
if (state == null)
89+
{
90+
state = threadStaticWriterOptionalState = new MemoryPackWriterOptionalState();
91+
}
92+
state.Init(options);
93+
94+
var writer = new MemoryPackWriter<ReusableLinkedArrayBufferWriter>(ref bufferWriter, state);
95+
96+
Serialize(type, ref writer, value);
97+
}
98+
8599
// Deserialize
86100

87101
public static object? Deserialize(Type type, ReadOnlySpan<byte> buffer, MemoryPackSerializerOptions? options = default)

src/MemoryPack.Unity/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackSerializer.NonGenerics.cs

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ public static async ValueTask SerializeAsync(Type type, Stream stream, object? v
8282
var tempWriter = ReusableLinkedArrayBufferWriterPool.Rent();
8383
try
8484
{
85-
Serialize(tempWriter, value, options);
85+
SerializeToTempWriter(tempWriter, type, value, options);
8686
await tempWriter.WriteToAndResetAsync(stream, cancellationToken).ConfigureAwait(false);
8787
}
8888
finally
@@ -91,6 +91,20 @@ public static async ValueTask SerializeAsync(Type type, Stream stream, object? v
9191
}
9292
}
9393

94+
static void SerializeToTempWriter(ReusableLinkedArrayBufferWriter bufferWriter, Type type, object? value, MemoryPackSerializerOptions? options)
95+
{
96+
var state = threadStaticWriterOptionalState;
97+
if (state == null)
98+
{
99+
state = threadStaticWriterOptionalState = new MemoryPackWriterOptionalState();
100+
}
101+
state.Init(options);
102+
103+
var writer = new MemoryPackWriter(ref Unsafe.As<ReusableLinkedArrayBufferWriter, IBufferWriter<byte>>(ref bufferWriter), state);
104+
105+
Serialize(type, ref writer, value);
106+
}
107+
94108
// Deserialize
95109

96110
public static object? Deserialize(Type type, ReadOnlySpan<byte> buffer, MemoryPackSerializerOptions? options = default)

tests/MemoryPack.Tests/NonGenerics.cs

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System;
22
using System.Collections.Generic;
3+
using System.IO;
34
using System.Linq;
45
using System.Text;
56
using System.Threading.Tasks;
@@ -21,6 +22,21 @@ public void StandardBin()
2122
v2![0].MyProperty.Should().Be(ForeE.C);
2223
v3![0].MyProperty.Should().Be(ForeE.C);
2324
}
25+
26+
// https://github.com/Cysharp/MemoryPack/issues/98
27+
[Fact]
28+
public async Task StreamCheck()
29+
{
30+
using var ms = new MemoryStream();
31+
32+
// Generic version works
33+
await MemoryPackSerializer.SerializeAsync(ms, new Item());
34+
35+
// Non generic version throws MemoryPackSerializationException: System.Object is not registered in this provider.
36+
await MemoryPackSerializer.SerializeAsync(typeof(Item), ms, new Item());
37+
38+
39+
}
2440
}
2541

2642
[MemoryPackable]
@@ -29,7 +45,11 @@ public partial class MyClass<T>
2945
public T? MyProperty { get; set; }
3046
}
3147

32-
48+
[MemoryPackable]
49+
public partial record Item
50+
{
51+
public string Value { get; init; } = Guid.NewGuid().ToString();
52+
}
3353

3454
public enum ForeE
3555
{

0 commit comments

Comments
 (0)