Skip to content

Commit 2fffd2f

Browse files
committed
BonSerializer boxed values.
1 parent 6fcac4a commit 2fffd2f

File tree

3 files changed

+26
-3
lines changed

3 files changed

+26
-3
lines changed

BTDB/Serialization/BonSerializer.cs

+11-3
Original file line numberDiff line numberDiff line change
@@ -42,16 +42,24 @@ public void SerializeObject(ref SerializerCtx ctx, ref byte value)
4242
return;
4343
}
4444

45-
var typePtr = obj.GetType().TypeHandle.Value;
45+
var type = obj.GetType();
46+
var typePtr = type.TypeHandle.Value;
4647
_cache.TryGetValue(typePtr, out var serializer);
4748
if (serializer == null)
4849
{
49-
serializer = CreateSerializerForType(obj.GetType());
50+
serializer = CreateSerializerForType(type);
5051
_cache.TryAdd(typePtr, serializer);
5152
_cache.TryGetValue(typePtr, out serializer);
5253
}
5354

54-
serializer!(ref ctx, ref value);
55+
if (type.IsValueType)
56+
{
57+
serializer!(ref ctx, ref RawData.Ref(obj, (uint)Unsafe.SizeOf<nint>()));
58+
}
59+
else
60+
{
61+
serializer!(ref ctx, ref value);
62+
}
5563
}
5664

5765
static unsafe ref BonSerializerCtx AsCtx(ref SerializerCtx ctx)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
"__type__": "Tuple",
3+
"Item1": 42,
4+
"Item2": 424242424242
5+
}

BTDBTest/SerializationTests/BonSerializerTest.cs

+10
Original file line numberDiff line numberDiff line change
@@ -60,4 +60,14 @@ public void SerializeDeserializeAllSupportedTypes()
6060
var bon = new Bon(builder.FinishAsMemory());
6161
this.Assent(bon.DumpToJson());
6262
}
63+
64+
[Fact]
65+
public void SerializeDeserializeBoxedValue()
66+
{
67+
var obj = (object)(42u, 424242424242L);
68+
var builder = new BonBuilder();
69+
BonSerializerFactory.Serialize(ref builder, obj);
70+
var bon = new Bon(builder.FinishAsMemory());
71+
this.Assent(bon.DumpToJson());
72+
}
6373
}

0 commit comments

Comments
 (0)