Skip to content

Commit c3db335

Browse files
committed
Bon deserializer Tuple tested.
1 parent 4b1fdb0 commit c3db335

File tree

2 files changed

+51
-4
lines changed

2 files changed

+51
-4
lines changed

BTDB/Serialization/BonSerializer.cs

+45-4
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ namespace BTDB.Serialization;
1313

1414
public delegate void Serialize(ref SerializerCtx ctx, ref byte value);
1515

16-
public delegate void Deserialize(ref DeserializerCtx ctx, ref byte value);
16+
public delegate bool Deserialize(ref DeserializerCtx ctx, ref byte value);
1717

1818
public interface ISerializerFactory
1919
{
@@ -502,6 +502,7 @@ public Deserialize CreateCachedDeserializerForType(Type type)
502502
return (ref DeserializerCtx ctx, ref byte value) =>
503503
{
504504
Unsafe.As<byte, object>(ref value) = AsCtx(ref ctx).Factory.DeserializeObject(ref ctx);
505+
return true;
505506
};
506507
}
507508

@@ -549,7 +550,7 @@ public Deserialize CreateCachedDeserializerForType(Type type)
549550
}
550551
case BonType.Tuple:
551552
{
552-
AsCtx(ref ctx).Bon.TryGetArray(out var arrayBon);
553+
AsCtx(ref ctx).Bon.TryGetTuple(out var arrayBon);
553554
arrayBon.TryGet(0, out var itemBon);
554555
var count = arrayBon.Items;
555556
if (count == 2)
@@ -650,7 +651,11 @@ public Deserialize CreateCachedDeserializerForName(ReadOnlySpan<byte> name)
650651
return deserializer!;
651652
}
652653

653-
return (ref DeserializerCtx ctx, ref byte value) => { AsCtx(ref ctx).Bon.Skip(); };
654+
return (ref DeserializerCtx ctx, ref byte _) =>
655+
{
656+
AsCtx(ref ctx).Bon.Skip();
657+
return false;
658+
};
654659
}
655660

656661
public Deserialize CreateDeserializerForType(Type type)
@@ -659,8 +664,16 @@ public Deserialize CreateDeserializerForType(Type type)
659664
{
660665
return static (ref DeserializerCtx ctx, ref byte value) =>
661666
{
662-
if (!AsCtx(ref ctx).Bon.TryGetString(out Unsafe.As<byte, string>(ref value)))
667+
if (AsCtx(ref ctx).Bon.TryGetString(out var v))
668+
{
669+
Unsafe.As<byte, string>(ref value) = v;
670+
return true;
671+
}
672+
else
673+
{
663674
AsCtx(ref ctx).Bon.Skip();
675+
return false;
676+
}
664677
};
665678
}
666679

@@ -671,10 +684,12 @@ public Deserialize CreateDeserializerForType(Type type)
671684
if (AsCtx(ref ctx).Bon.TryGetULong(out var v))
672685
{
673686
value = (byte)v;
687+
return true;
674688
}
675689
else
676690
{
677691
AsCtx(ref ctx).Bon.Skip();
692+
return false;
678693
}
679694
};
680695
}
@@ -686,10 +701,12 @@ public Deserialize CreateDeserializerForType(Type type)
686701
if (AsCtx(ref ctx).Bon.TryGetLong(out var v))
687702
{
688703
Unsafe.As<byte, sbyte>(ref value) = (sbyte)v;
704+
return true;
689705
}
690706
else
691707
{
692708
AsCtx(ref ctx).Bon.Skip();
709+
return false;
693710
}
694711
};
695712
}
@@ -701,10 +718,12 @@ public Deserialize CreateDeserializerForType(Type type)
701718
if (AsCtx(ref ctx).Bon.TryGetULong(out var v))
702719
{
703720
Unsafe.As<byte, ushort>(ref value) = (ushort)v;
721+
return true;
704722
}
705723
else
706724
{
707725
AsCtx(ref ctx).Bon.Skip();
726+
return false;
708727
}
709728
};
710729
}
@@ -716,10 +735,12 @@ public Deserialize CreateDeserializerForType(Type type)
716735
if (AsCtx(ref ctx).Bon.TryGetLong(out var v))
717736
{
718737
Unsafe.As<byte, short>(ref value) = (short)v;
738+
return true;
719739
}
720740
else
721741
{
722742
AsCtx(ref ctx).Bon.Skip();
743+
return false;
723744
}
724745
};
725746
}
@@ -731,10 +752,12 @@ public Deserialize CreateDeserializerForType(Type type)
731752
if (AsCtx(ref ctx).Bon.TryGetULong(out var v))
732753
{
733754
Unsafe.As<byte, uint>(ref value) = (uint)v;
755+
return true;
734756
}
735757
else
736758
{
737759
AsCtx(ref ctx).Bon.Skip();
760+
return false;
738761
}
739762
};
740763
}
@@ -746,10 +769,12 @@ public Deserialize CreateDeserializerForType(Type type)
746769
if (AsCtx(ref ctx).Bon.TryGetLong(out var v))
747770
{
748771
Unsafe.As<byte, int>(ref value) = (int)v;
772+
return true;
749773
}
750774
else
751775
{
752776
AsCtx(ref ctx).Bon.Skip();
777+
return false;
753778
}
754779
};
755780
}
@@ -761,10 +786,12 @@ public Deserialize CreateDeserializerForType(Type type)
761786
if (AsCtx(ref ctx).Bon.TryGetULong(out var v))
762787
{
763788
Unsafe.As<byte, ulong>(ref value) = v;
789+
return true;
764790
}
765791
else
766792
{
767793
AsCtx(ref ctx).Bon.Skip();
794+
return false;
768795
}
769796
};
770797
}
@@ -776,10 +803,12 @@ public Deserialize CreateDeserializerForType(Type type)
776803
if (AsCtx(ref ctx).Bon.TryGetLong(out var v))
777804
{
778805
Unsafe.As<byte, long>(ref value) = v;
806+
return true;
779807
}
780808
else
781809
{
782810
AsCtx(ref ctx).Bon.Skip();
811+
return false;
783812
}
784813
};
785814
}
@@ -791,10 +820,12 @@ public Deserialize CreateDeserializerForType(Type type)
791820
if (AsCtx(ref ctx).Bon.TryGetDouble(out var v))
792821
{
793822
Unsafe.As<byte, float>(ref value) = (float)v;
823+
return true;
794824
}
795825
else
796826
{
797827
AsCtx(ref ctx).Bon.Skip();
828+
return false;
798829
}
799830
};
800831
}
@@ -806,10 +837,12 @@ public Deserialize CreateDeserializerForType(Type type)
806837
if (AsCtx(ref ctx).Bon.TryGetDouble(out var v))
807838
{
808839
Unsafe.As<byte, double>(ref value) = v;
840+
return true;
809841
}
810842
else
811843
{
812844
AsCtx(ref ctx).Bon.Skip();
845+
return false;
813846
}
814847
};
815848
}
@@ -821,10 +854,12 @@ public Deserialize CreateDeserializerForType(Type type)
821854
if (AsCtx(ref ctx).Bon.TryGetBool(out var v))
822855
{
823856
Unsafe.As<byte, bool>(ref value) = v;
857+
return true;
824858
}
825859
else
826860
{
827861
AsCtx(ref ctx).Bon.Skip();
862+
return false;
828863
}
829864
};
830865
}
@@ -836,10 +871,12 @@ public Deserialize CreateDeserializerForType(Type type)
836871
if (AsCtx(ref ctx).Bon.TryGetDateTime(out var v))
837872
{
838873
Unsafe.As<byte, DateTime>(ref value) = v;
874+
return true;
839875
}
840876
else
841877
{
842878
AsCtx(ref ctx).Bon.Skip();
879+
return false;
843880
}
844881
};
845882
}
@@ -851,10 +888,12 @@ public Deserialize CreateDeserializerForType(Type type)
851888
if (AsCtx(ref ctx).Bon.TryGetGuid(out var v))
852889
{
853890
Unsafe.As<byte, Guid>(ref value) = v;
891+
return true;
854892
}
855893
else
856894
{
857895
AsCtx(ref ctx).Bon.Skip();
896+
return false;
858897
}
859898
};
860899
}
@@ -866,10 +905,12 @@ public Deserialize CreateDeserializerForType(Type type)
866905
if (AsCtx(ref ctx).Bon.TryGetDouble(out var v))
867906
{
868907
Unsafe.As<byte, Half>(ref value) = (Half)v;
908+
return true;
869909
}
870910
else
871911
{
872912
AsCtx(ref ctx).Bon.Skip();
913+
return false;
873914
}
874915
};
875916
}

BTDBTest/SerializationTests/BonSerializerTest.cs

+6
Original file line numberDiff line numberDiff line change
@@ -69,5 +69,11 @@ public void SerializeDeserializeBoxedValue()
6969
BonSerializerFactory.Serialize(ref builder, obj);
7070
var bon = new Bon(builder.FinishAsMemory());
7171
this.Assent(bon.DumpToJson());
72+
bon = new Bon(builder.FinishAsMemory());
73+
var deserialized = BonSerializerFactory.Deserialize(ref bon);
74+
Assert.IsType<Tuple<object, object>>(deserialized);
75+
var (a, b) = (Tuple<object, object>)deserialized;
76+
Assert.Equal(42u, (ulong)a);
77+
Assert.Equal(424242424242L, (long)(ulong)b);
7278
}
7379
}

0 commit comments

Comments
 (0)