Skip to content

Commit

Permalink
Bon deserializer Tuple tested.
Browse files Browse the repository at this point in the history
  • Loading branch information
Bobris committed Mar 18, 2024
1 parent 4b1fdb0 commit c3db335
Show file tree
Hide file tree
Showing 2 changed files with 51 additions and 4 deletions.
49 changes: 45 additions & 4 deletions BTDB/Serialization/BonSerializer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ namespace BTDB.Serialization;

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

public delegate void Deserialize(ref DeserializerCtx ctx, ref byte value);
public delegate bool Deserialize(ref DeserializerCtx ctx, ref byte value);

public interface ISerializerFactory
{
Expand Down Expand Up @@ -502,6 +502,7 @@ public Deserialize CreateCachedDeserializerForType(Type type)
return (ref DeserializerCtx ctx, ref byte value) =>
{
Unsafe.As<byte, object>(ref value) = AsCtx(ref ctx).Factory.DeserializeObject(ref ctx);
return true;
};
}

Expand Down Expand Up @@ -549,7 +550,7 @@ public Deserialize CreateCachedDeserializerForType(Type type)
}
case BonType.Tuple:
{
AsCtx(ref ctx).Bon.TryGetArray(out var arrayBon);
AsCtx(ref ctx).Bon.TryGetTuple(out var arrayBon);
arrayBon.TryGet(0, out var itemBon);
var count = arrayBon.Items;
if (count == 2)
Expand Down Expand Up @@ -650,7 +651,11 @@ public Deserialize CreateCachedDeserializerForName(ReadOnlySpan<byte> name)
return deserializer!;
}

return (ref DeserializerCtx ctx, ref byte value) => { AsCtx(ref ctx).Bon.Skip(); };
return (ref DeserializerCtx ctx, ref byte _) =>
{
AsCtx(ref ctx).Bon.Skip();
return false;
};
}

public Deserialize CreateDeserializerForType(Type type)
Expand All @@ -659,8 +664,16 @@ public Deserialize CreateDeserializerForType(Type type)
{
return static (ref DeserializerCtx ctx, ref byte value) =>
{
if (!AsCtx(ref ctx).Bon.TryGetString(out Unsafe.As<byte, string>(ref value)))
if (AsCtx(ref ctx).Bon.TryGetString(out var v))
{
Unsafe.As<byte, string>(ref value) = v;
return true;
}
else
{
AsCtx(ref ctx).Bon.Skip();
return false;
}
};
}

Expand All @@ -671,10 +684,12 @@ public Deserialize CreateDeserializerForType(Type type)
if (AsCtx(ref ctx).Bon.TryGetULong(out var v))
{
value = (byte)v;
return true;
}
else
{
AsCtx(ref ctx).Bon.Skip();
return false;
}
};
}
Expand All @@ -686,10 +701,12 @@ public Deserialize CreateDeserializerForType(Type type)
if (AsCtx(ref ctx).Bon.TryGetLong(out var v))
{
Unsafe.As<byte, sbyte>(ref value) = (sbyte)v;
return true;
}
else
{
AsCtx(ref ctx).Bon.Skip();
return false;
}
};
}
Expand All @@ -701,10 +718,12 @@ public Deserialize CreateDeserializerForType(Type type)
if (AsCtx(ref ctx).Bon.TryGetULong(out var v))
{
Unsafe.As<byte, ushort>(ref value) = (ushort)v;
return true;
}
else
{
AsCtx(ref ctx).Bon.Skip();
return false;
}
};
}
Expand All @@ -716,10 +735,12 @@ public Deserialize CreateDeserializerForType(Type type)
if (AsCtx(ref ctx).Bon.TryGetLong(out var v))
{
Unsafe.As<byte, short>(ref value) = (short)v;
return true;
}
else
{
AsCtx(ref ctx).Bon.Skip();
return false;
}
};
}
Expand All @@ -731,10 +752,12 @@ public Deserialize CreateDeserializerForType(Type type)
if (AsCtx(ref ctx).Bon.TryGetULong(out var v))
{
Unsafe.As<byte, uint>(ref value) = (uint)v;
return true;
}
else
{
AsCtx(ref ctx).Bon.Skip();
return false;
}
};
}
Expand All @@ -746,10 +769,12 @@ public Deserialize CreateDeserializerForType(Type type)
if (AsCtx(ref ctx).Bon.TryGetLong(out var v))
{
Unsafe.As<byte, int>(ref value) = (int)v;
return true;
}
else
{
AsCtx(ref ctx).Bon.Skip();
return false;
}
};
}
Expand All @@ -761,10 +786,12 @@ public Deserialize CreateDeserializerForType(Type type)
if (AsCtx(ref ctx).Bon.TryGetULong(out var v))
{
Unsafe.As<byte, ulong>(ref value) = v;
return true;
}
else
{
AsCtx(ref ctx).Bon.Skip();
return false;
}
};
}
Expand All @@ -776,10 +803,12 @@ public Deserialize CreateDeserializerForType(Type type)
if (AsCtx(ref ctx).Bon.TryGetLong(out var v))
{
Unsafe.As<byte, long>(ref value) = v;
return true;
}
else
{
AsCtx(ref ctx).Bon.Skip();
return false;
}
};
}
Expand All @@ -791,10 +820,12 @@ public Deserialize CreateDeserializerForType(Type type)
if (AsCtx(ref ctx).Bon.TryGetDouble(out var v))
{
Unsafe.As<byte, float>(ref value) = (float)v;
return true;
}
else
{
AsCtx(ref ctx).Bon.Skip();
return false;
}
};
}
Expand All @@ -806,10 +837,12 @@ public Deserialize CreateDeserializerForType(Type type)
if (AsCtx(ref ctx).Bon.TryGetDouble(out var v))
{
Unsafe.As<byte, double>(ref value) = v;
return true;
}
else
{
AsCtx(ref ctx).Bon.Skip();
return false;
}
};
}
Expand All @@ -821,10 +854,12 @@ public Deserialize CreateDeserializerForType(Type type)
if (AsCtx(ref ctx).Bon.TryGetBool(out var v))
{
Unsafe.As<byte, bool>(ref value) = v;
return true;
}
else
{
AsCtx(ref ctx).Bon.Skip();
return false;
}
};
}
Expand All @@ -836,10 +871,12 @@ public Deserialize CreateDeserializerForType(Type type)
if (AsCtx(ref ctx).Bon.TryGetDateTime(out var v))
{
Unsafe.As<byte, DateTime>(ref value) = v;
return true;
}
else
{
AsCtx(ref ctx).Bon.Skip();
return false;
}
};
}
Expand All @@ -851,10 +888,12 @@ public Deserialize CreateDeserializerForType(Type type)
if (AsCtx(ref ctx).Bon.TryGetGuid(out var v))
{
Unsafe.As<byte, Guid>(ref value) = v;
return true;
}
else
{
AsCtx(ref ctx).Bon.Skip();
return false;
}
};
}
Expand All @@ -866,10 +905,12 @@ public Deserialize CreateDeserializerForType(Type type)
if (AsCtx(ref ctx).Bon.TryGetDouble(out var v))
{
Unsafe.As<byte, Half>(ref value) = (Half)v;
return true;
}
else
{
AsCtx(ref ctx).Bon.Skip();
return false;
}
};
}
Expand Down
6 changes: 6 additions & 0 deletions BTDBTest/SerializationTests/BonSerializerTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -69,5 +69,11 @@ public void SerializeDeserializeBoxedValue()
BonSerializerFactory.Serialize(ref builder, obj);
var bon = new Bon(builder.FinishAsMemory());
this.Assent(bon.DumpToJson());
bon = new Bon(builder.FinishAsMemory());
var deserialized = BonSerializerFactory.Deserialize(ref bon);
Assert.IsType<Tuple<object, object>>(deserialized);
var (a, b) = (Tuple<object, object>)deserialized;
Assert.Equal(42u, (ulong)a);
Assert.Equal(424242424242L, (long)(ulong)b);
}
}

0 comments on commit c3db335

Please sign in to comment.