Skip to content

Commit 9dac52f

Browse files
committed
fix char[] array cannot be serialized or deserialized. #199
1 parent 9aa51ce commit 9dac52f

8 files changed

Lines changed: 24 additions & 13 deletions

File tree

sandbox/SandboxWebApp/wwwroot/js/memorypack/AllConvertableType.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import { MemoryPackWriter } from "./MemoryPackWriter.js";
22
import { MemoryPackReader } from "./MemoryPackReader.js";
3-
import { NoMarkByteEnum } from "./NoMarkByteEnum.js";
4-
import { NumberedUShortEnum } from "./NumberedUShortEnum.js";
5-
import { NestedObject } from "./NestedObject.js";
6-
import { IMogeUnion } from "./IMogeUnion.js";
3+
import { NoMarkByteEnum } from "./NoMarkByteEnum.js";
4+
import { NumberedUShortEnum } from "./NumberedUShortEnum.js";
5+
import { NestedObject } from "./NestedObject.js";
6+
import { IMogeUnion } from "./IMogeUnion.js";
77

88
export class AllConvertableType {
99
myBool: boolean;

sandbox/SandboxWebApp/wwwroot/js/memorypack/ArrayGenericsCheck.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import { MemoryPackWriter } from "./MemoryPackWriter.js";
22
import { MemoryPackReader } from "./MemoryPackReader.js";
3-
import { NoMarkByteEnum } from "./NoMarkByteEnum.js";
4-
import { NestedObject } from "./NestedObject.js";
5-
import { IMogeUnion } from "./IMogeUnion.js";
3+
import { NoMarkByteEnum } from "./NoMarkByteEnum.js";
4+
import { NestedObject } from "./NestedObject.js";
5+
import { IMogeUnion } from "./IMogeUnion.js";
66

77
export class ArrayGenericsCheck {
88
array1: (NestedObject | null)[] | null;

sandbox/SandboxWebApp/wwwroot/js/memorypack/Person.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { MemoryPackWriter } from "./MemoryPackWriter.js";
22
import { MemoryPackReader } from "./MemoryPackReader.js";
3-
import { Gender } from "./Gender.js";
3+
import { Gender } from "./Gender.js";
44

55
export class Person {
66
id: string;

sandbox/SandboxWebApp/wwwroot/js/memorypack/SampleUnion1.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { MemoryPackWriter } from "./MemoryPackWriter.js";
22
import { MemoryPackReader } from "./MemoryPackReader.js";
3-
import { IMogeUnion } from "./IMogeUnion.js";
3+
import { IMogeUnion } from "./IMogeUnion.js";
44

55
export class SampleUnion1 implements IMogeUnion {
66
myProperty: number | null;

sandbox/SandboxWebApp/wwwroot/js/memorypack/SampleUnion2.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { MemoryPackWriter } from "./MemoryPackWriter.js";
22
import { MemoryPackReader } from "./MemoryPackReader.js";
3-
import { IMogeUnion } from "./IMogeUnion.js";
3+
import { IMogeUnion } from "./IMogeUnion.js";
44

55
export class SampleUnion2 implements IMogeUnion {
66
myProperty: string | null;

src/MemoryPack.Core/Internal/TypeHelpers.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ namespace MemoryPack.Internal;
77
internal static class TypeHelpers
88
{
99
static readonly MethodInfo isReferenceOrContainsReferences = typeof(RuntimeHelpers).GetMethod("IsReferenceOrContainsReferences")!;
10+
static readonly MethodInfo unsafeSizeOf = typeof(Unsafe).GetMethod("SizeOf")!;
1011

1112
[MethodImpl(MethodImplOptions.AggressiveInlining)]
1213
public static bool IsReferenceOrNullable<T>()
@@ -67,7 +68,7 @@ static Cache()
6768
if (!containsReference)
6869
{
6970
IsUnmanagedSZArray = true;
70-
UnmanagedSZArrayElementSize = Marshal.SizeOf(elementType!);
71+
UnmanagedSZArrayElementSize = (int)unsafeSizeOf.MakeGenericMethod(elementType!).Invoke(null, null)!;
7172
}
7273
}
7374
#if NET7_0_OR_GREATER

src/MemoryPack.Unity/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Internal/TypeHelpers.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ namespace MemoryPack.Internal {
1616
internal static class TypeHelpers
1717
{
1818
static readonly MethodInfo isReferenceOrContainsReferences = typeof(RuntimeHelpers).GetMethod("IsReferenceOrContainsReferences")!;
19+
static readonly MethodInfo unsafeSizeOf = typeof(Unsafe).GetMethod("SizeOf")!;
1920

2021
[MethodImpl(MethodImplOptions.AggressiveInlining)]
2122
public static bool IsReferenceOrNullable<T>()
@@ -76,7 +77,7 @@ static Cache()
7677
if (!containsReference)
7778
{
7879
IsUnmanagedSZArray = true;
79-
UnmanagedSZArrayElementSize = Marshal.SizeOf(elementType!);
80+
UnmanagedSZArrayElementSize = (int)unsafeSizeOf.MakeGenericMethod(elementType!).Invoke(null, null)!;
8081
}
8182
}
8283
#if NET7_0_OR_GREATER

tests/MemoryPack.Tests/ArrayFormatterTest.cs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ public void ArrayTes()
3535
Convert(xs).ToArray().Should().Equal(xs.ToArray());
3636
}
3737
{
38-
var xs =new ReadOnlyMemory<int>(new int[] { 1, 10, 100 });
38+
var xs = new ReadOnlyMemory<int>(new int[] { 1, 10, 100 });
3939
Convert(xs).ToArray().Should().Equal(xs.ToArray());
4040
}
4141
//{
@@ -53,6 +53,15 @@ public void ArrayTes()
5353
}
5454
}
5555

56+
[Fact]
57+
public void CharArrayTest()
58+
{
59+
var input = new[] { 'a', 'b', 'c' };
60+
var bytes = MemoryPackSerializer.Serialize(input);
61+
var output = MemoryPackSerializer.Deserialize<char[]>(bytes)!;
62+
Assert.True(input.SequenceEqual(output));
63+
}
64+
5665
[Theory]
5766
[InlineData(100, 100, 10, 5)]
5867
[InlineData(10, 20, 15, 5)]

0 commit comments

Comments
 (0)