serialization improves and benchmarks
This commit is contained in:
@@ -0,0 +1,19 @@
|
||||
using System;
|
||||
using System.Formats.Cbor;
|
||||
using System.Runtime.CompilerServices;
|
||||
using System.Runtime.InteropServices;
|
||||
using mROA.Implementation;
|
||||
|
||||
namespace mROA.Cbor
|
||||
{
|
||||
public static class CborExtensions
|
||||
{
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
public static unsafe void WriteToCborInline(this RequestId id, CborWriter writer)
|
||||
{
|
||||
Span<byte> span = stackalloc byte[16];
|
||||
MemoryMarshal.Write(span, ref id);
|
||||
writer.WriteByteString(span);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -18,7 +18,7 @@ namespace mROA.Cbor
|
||||
|
||||
private readonly IOrdinaryStructureParser[] _parsers =
|
||||
{
|
||||
new NetworkMessageHeaderParser(), new DefaultCallRequestParser(), new FinalCommandExecutionParser(),
|
||||
new DefaultCallRequestParser(), new FinalCommandExecutionParser(),
|
||||
new FinalCommandExecutionResultlessParser()
|
||||
};
|
||||
|
||||
@@ -27,27 +27,21 @@ namespace mROA.Cbor
|
||||
|
||||
private bool FindParser(Type t, out IOrdinaryStructureParser parser)
|
||||
{
|
||||
if (t == typeof(NetworkMessage))
|
||||
if (t == typeof(DefaultCallRequest))
|
||||
{
|
||||
parser = _parsers[0];
|
||||
return true;
|
||||
}
|
||||
|
||||
if (t == typeof(DefaultCallRequest))
|
||||
if (t == typeof(FinalCommandExecution<object>))
|
||||
{
|
||||
parser = _parsers[1];
|
||||
return true;
|
||||
}
|
||||
|
||||
if (t == typeof(FinalCommandExecution<object>))
|
||||
{
|
||||
parser = _parsers[2];
|
||||
return true;
|
||||
}
|
||||
|
||||
if (t == typeof(FinalCommandExecution))
|
||||
{
|
||||
parser = _parsers[3];
|
||||
parser = _parsers[2];
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -165,7 +159,8 @@ namespace mROA.Cbor
|
||||
writer.WriteDateTimeOffset(dto);
|
||||
break;
|
||||
case RequestId g:
|
||||
writer.WriteByteString(g.ToByteArray());
|
||||
// writer.WriteByteString(g.ToByteArray());
|
||||
g.WriteToCborInline(writer);
|
||||
break;
|
||||
case byte[] bytes:
|
||||
writer.WriteByteString(bytes);
|
||||
|
||||
@@ -12,38 +12,14 @@ namespace mROA.Cbor
|
||||
object Read(CborReader reader, IEndPointContext context, CborSerializationToolkit serialization);
|
||||
}
|
||||
|
||||
public class NetworkMessageHeaderParser : IOrdinaryStructureParser
|
||||
{
|
||||
public void Write(CborWriter writer, object value, IEndPointContext context, CborSerializationToolkit serialization)
|
||||
{
|
||||
var v = value as NetworkMessage;
|
||||
writer.WriteStartArray(3);
|
||||
writer.WriteByteString(v.Id.ToByteArray());
|
||||
writer.WriteInt32((int)v.MessageType);
|
||||
writer.WriteByteString(v.Data);
|
||||
writer.WriteEndArray();
|
||||
}
|
||||
|
||||
public object Read(CborReader reader, IEndPointContext context, CborSerializationToolkit serialization)
|
||||
{
|
||||
reader.ReadStartArray();
|
||||
var value = new NetworkMessage
|
||||
{
|
||||
Id = new RequestId(reader.ReadByteString()),
|
||||
MessageType = (EMessageType)reader.ReadInt32(),
|
||||
Data = reader.ReadByteString()
|
||||
};
|
||||
return value;
|
||||
}
|
||||
}
|
||||
|
||||
public class DefaultCallRequestParser : IOrdinaryStructureParser
|
||||
{
|
||||
public void Write(CborWriter writer, object value, IEndPointContext context, CborSerializationToolkit serialization)
|
||||
{
|
||||
var v = (DefaultCallRequest)value;
|
||||
writer.WriteStartArray(4);
|
||||
writer.WriteByteString(v.Id.ToByteArray());
|
||||
v.Id.WriteToCborInline(writer);
|
||||
// writer.WriteByteString(v.Id.ToByteArray());
|
||||
writer.WriteInt32(v.CommandId);
|
||||
writer.WriteStartArray(1);
|
||||
writer.WriteUInt64(v.ObjectId.Flat);
|
||||
@@ -92,7 +68,8 @@ namespace mROA.Cbor
|
||||
{
|
||||
var v = (FinalCommandExecution<object>)value;
|
||||
writer.WriteStartArray(2);
|
||||
writer.WriteByteString(v.Id.ToByteArray());
|
||||
// writer.WriteByteString(v.Id.ToByteArray());
|
||||
v.Id.WriteToCborInline(writer);
|
||||
serialization.WriteData(v.Result, writer, context);
|
||||
writer.WriteEndArray();
|
||||
}
|
||||
@@ -116,7 +93,8 @@ namespace mROA.Cbor
|
||||
{
|
||||
var v = (FinalCommandExecution)value;
|
||||
writer.WriteStartArray(1);
|
||||
writer.WriteByteString(v.Id.ToByteArray());
|
||||
// writer.WriteByteString(v.Id.ToByteArray());
|
||||
v.Id.WriteToCborInline(writer);
|
||||
writer.WriteEndArray();
|
||||
}
|
||||
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
<Version>2.0.7</Version>
|
||||
<LangVersion>9</LangVersion>
|
||||
<PackageIcon>mroaLogo.png</PackageIcon>
|
||||
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
|
||||
|
||||
Reference in New Issue
Block a user