diff --git a/mROA.Cbor/CborSerializationToolkit.cs b/mROA.Cbor/CborSerializationToolkit.cs index 608abdc..bd9d63f 100644 --- a/mROA.Cbor/CborSerializationToolkit.cs +++ b/mROA.Cbor/CborSerializationToolkit.cs @@ -14,10 +14,43 @@ namespace mROA.Cbor { public class CborSerializationToolkit : IContextualSerializationToolKit { - private Dictionary _parsers = new(){{typeof(NetworkMessageHeader), new NetworkMessageHeaderParser()}, {typeof(DefaultCallRequest), new DefaultCallRequestParser()}, {typeof(FinalCommandExecution), new FinalCommandExecutionParser()}, {typeof(FinalCommandExecution), new FinalCommandExecutionResultlessParser()}}; // + private readonly IOrdinaryStructureParser[] _parsers = { + new NetworkMessageHeaderParser(), new DefaultCallRequestParser(), new FinalCommandExecutionParser(), + new FinalCommandExecutionResultlessParser() + }; + // private Dictionary _parsers = new(){{typeof(NetworkMessageHeader), new NetworkMessageHeaderParser()}, {typeof(DefaultCallRequest), new DefaultCallRequestParser()}, {typeof(FinalCommandExecution), new FinalCommandExecutionParser()}, {typeof(FinalCommandExecution), new FinalCommandExecutionResultlessParser()}}; // private Dictionary> _propertiesCache = new(); public static TimeSpan SerializationTime = TimeSpan.Zero; - private HashSet a; + + private bool FindParser(Type t, out IOrdinaryStructureParser parser) + { + if (t == typeof(NetworkMessageHeader)) + { + parser = _parsers[0]; + return true; + } + + if (t == typeof(DefaultCallRequest)) + { + parser = _parsers[1]; + return true; + } + + if (t == typeof(FinalCommandExecution)) + { + parser = _parsers[2]; + return true; + } + + if (t == typeof(FinalCommandExecution)) + { + parser = _parsers[3]; + return true; + } + + parser = null; + return false; + } public byte[] Serialize(object objectToSerialize, IEndPointContext context) { var sw = Stopwatch.StartNew(); @@ -128,7 +161,7 @@ namespace mROA.Cbor public void WriteData(object? obj, CborWriter writer, IEndPointContext? context) { - if (obj is not null && _parsers.TryGetValue(obj.GetType(), out var parser)) + if (obj is not null && FindParser(obj.GetType(), out var parser)) { parser.Write(writer, obj, context, this); return; @@ -251,7 +284,7 @@ namespace mROA.Cbor public object? ReadData(CborReader reader, Type? type, IEndPointContext? context) { - if (type is not null && _parsers.TryGetValue(type, out var parser)) + if (type is not null && FindParser(type, out var parser)) { return parser.Read(reader, context, this); } diff --git a/mROA.Cbor/IOrdinaryStructureParser.cs b/mROA.Cbor/IOrdinaryStructureParser.cs index 6ea1545..8ceb61e 100644 --- a/mROA.Cbor/IOrdinaryStructureParser.cs +++ b/mROA.Cbor/IOrdinaryStructureParser.cs @@ -17,7 +17,7 @@ namespace mROA.Cbor { public void Write(CborWriter writer, object value, IEndPointContext context, CborSerializationToolkit serialization) { - var v = value as NetworkMessageHeader; + var v = (NetworkMessageHeader)value; writer.WriteStartArray(3); writer.WriteByteString(v.Id.ToByteArray()); writer.WriteInt32((int)v.MessageType); @@ -91,10 +91,10 @@ namespace mROA.Cbor { public void Write(CborWriter writer, object value, IEndPointContext context, CborSerializationToolkit serialization) { - var v = value as FinalCommandExecution; + var v = (FinalCommandExecution)value; writer.WriteStartArray(2); - serialization.WriteData(v.Result, writer, context); writer.WriteByteString(v.Id.ToByteArray()); + serialization.WriteData(v.Result, writer, context); writer.WriteEndArray(); } @@ -103,8 +103,8 @@ namespace mROA.Cbor reader.ReadStartArray(); var result = new FinalCommandExecution { + Id = new Guid(reader.ReadByteString()), Result = serialization.ReadData(reader, typeof(object), context), - Id = new Guid(reader.ReadByteString()) }; reader.ReadEndArray(); return result; @@ -115,7 +115,7 @@ namespace mROA.Cbor { public void Write(CborWriter writer, object value, IEndPointContext context, CborSerializationToolkit serialization) { - var v = value as FinalCommandExecution; + var v = (FinalCommandExecution)value; writer.WriteStartArray(1); writer.WriteByteString(v.Id.ToByteArray()); writer.WriteEndArray(); diff --git a/mROA/Implementation/CancellationRepository.cs b/mROA/Implementation/CancellationRepository.cs index 3bc93c2..3fae6fc 100644 --- a/mROA/Implementation/CancellationRepository.cs +++ b/mROA/Implementation/CancellationRepository.cs @@ -8,7 +8,7 @@ namespace mROA.Implementation { public class CancellationRepository : ICancellationRepository { - private ConcurrentDictionary _cancellations = new(); + private readonly ConcurrentDictionary _cancellations = new(); public void RegisterCancellation(Guid id, CancellationTokenSource cts) { diff --git a/mROA/Implementation/ChannelInteractionModule.cs b/mROA/Implementation/ChannelInteractionModule.cs index 5d71447..4c9858f 100644 --- a/mROA/Implementation/ChannelInteractionModule.cs +++ b/mROA/Implementation/ChannelInteractionModule.cs @@ -127,7 +127,7 @@ namespace mROA.Implementation } else { - await _trustedWriter.WriteAsync(new NetworkMessageHeader()); + await _trustedWriter.WriteAsync(new NetworkMessageHeader(){Data = Array.Empty()}); } PassReconnection(); diff --git a/mROA/Implementation/CommandExecution/FinalCommandExecution.cs b/mROA/Implementation/CommandExecution/FinalCommandExecution.cs index c94a4d1..f22723f 100644 --- a/mROA/Implementation/CommandExecution/FinalCommandExecution.cs +++ b/mROA/Implementation/CommandExecution/FinalCommandExecution.cs @@ -5,14 +5,16 @@ using mROA.Abstract; namespace mROA.Implementation.CommandExecution { - public class FinalCommandExecution : ICommandExecution + public struct FinalCommandExecution : ICommandExecution { public Guid Id { get; set; } public EMessageType MessageType => EMessageType.FinishedCommandExecution; } - public class FinalCommandExecution : FinalCommandExecution + public struct FinalCommandExecution : ICommandExecution { + public Guid Id { get; set; } + public EMessageType MessageType => EMessageType.FinishedCommandExecution; public T? Result { get; set; } } } \ No newline at end of file diff --git a/mROA/Implementation/NetworkMessageHeader.cs b/mROA/Implementation/NetworkMessageHeader.cs index 93894a7..1729499 100644 --- a/mROA/Implementation/NetworkMessageHeader.cs +++ b/mROA/Implementation/NetworkMessageHeader.cs @@ -5,7 +5,7 @@ using mROA.Abstract; namespace mROA.Implementation { - public class NetworkMessageHeader + public struct NetworkMessageHeader { private bool Equals(NetworkMessageHeader other) { @@ -21,12 +21,10 @@ namespace mROA.Implementation } public static readonly NetworkMessageHeader Null = new(); - public NetworkMessageHeader() - { - Id = Guid.NewGuid(); - MessageType = EMessageType.Unknown; - Data = Array.Empty(); - } + // public NetworkMessageHeader() + // { + // Data = Array.Empty(); + // } public NetworkMessageHeader(IContextualSerializationToolKit serializationToolkit, INetworkMessage networkMessage, IEndPointContext? context) { diff --git a/mROA/Implementation/RepresentationModule.cs b/mROA/Implementation/RepresentationModule.cs index 4bc64ba..1afb9cb 100644 --- a/mROA/Implementation/RepresentationModule.cs +++ b/mROA/Implementation/RepresentationModule.cs @@ -71,9 +71,17 @@ namespace mROA.Implementation continue; } - var type = converter.Select(i => i(message)).First(i => i != null)!; - var deserialized = _serialization.Deserialize(message.Data, type, context); - yield return (deserialized, message.MessageType)!; + + for (int i = 0; i < converter.Length; i++) + { + var func = converter[i]; + if (func(message) is {} t) + { + var deserialized = _serialization.Deserialize(message.Data, t, context); + yield return (deserialized, message.MessageType)!; + break; + } + } } }