From 0f355b9df3df1ed7fcb0683eab8e28e8a507a0e9 Mon Sep 17 00:00:00 2001 From: Mikhail Mitrofanov Date: Thu, 7 Aug 2025 19:14:17 +0300 Subject: [PATCH] Flat COI binary representation --- mROA.Cbor/CborSerializationToolkit.cs | 38 +++++++++++++++++---------- mROA.Cbor/IOrdinaryStructureParser.cs | 6 ----- 2 files changed, 24 insertions(+), 20 deletions(-) diff --git a/mROA.Cbor/CborSerializationToolkit.cs b/mROA.Cbor/CborSerializationToolkit.cs index 3005cb9..e779720 100644 --- a/mROA.Cbor/CborSerializationToolkit.cs +++ b/mROA.Cbor/CborSerializationToolkit.cs @@ -115,6 +115,11 @@ namespace mROA.Cbor return new RequestId((byte[])nonCasted); } + if (type.IsInterface) + { + return ReadSharedShell(type, context, (ulong)nonCasted); + } + return Convert.ChangeType(nonCasted, type); } @@ -235,9 +240,7 @@ namespace mROA.Cbor Activator.CreateInstance(sharedShell, obj, context) as ISharedObjectShell; - writer.WriteStartArray(1); writer.WriteUInt64(so.Identifier.Flat); - writer.WriteEndArray(); return; } @@ -267,7 +270,10 @@ namespace mROA.Cbor return reader.ReadInt64(); if (type == typeof(uint)) return reader.ReadUInt32(); - + if (type.IsInterface) + { + return ReadSharedShell(type, context, reader.ReadUInt64()); + } return reader.ReadUInt64(); case CborReaderState.ByteString: if (type == typeof(RequestId)) @@ -378,19 +384,9 @@ namespace mROA.Cbor if (type.IsInterface) { - var sharedShell = typeof(SharedObjectShellShell<>).MakeGenericType(type); - var so = - Activator.CreateInstance(sharedShell) as - ISharedObjectShell; - if (context != null) - so.EndPointContext = context; - - reader.ReadStartArray(); var identifier = reader.ReadUInt64(); - reader.ReadEndArray(); - so.Identifier = ComplexObjectIdentifier.FromFlat(identifier); - return so.UniversalValue; + return ReadSharedShell(type, context, identifier); } var instance = Activator.CreateInstance(type)!; @@ -400,6 +396,20 @@ namespace mROA.Cbor return instance; } + private static object ReadSharedShell(Type type, IEndPointContext? context, ulong identifier) + { + var sharedShell = typeof(SharedObjectShellShell<>).MakeGenericType(type); + var so = + Activator.CreateInstance(sharedShell) as + ISharedObjectShell; + if (context != null) + so.EndPointContext = context; + + + so.Identifier = ComplexObjectIdentifier.FromFlat(identifier); + return so.UniversalValue; + } + private ISharedObjectShell ReadSharedObject(CborReader reader, Type type, IEndPointContext? context) { var sharedObject = (Activator.CreateInstance(type) as ISharedObjectShell)!; diff --git a/mROA.Cbor/IOrdinaryStructureParser.cs b/mROA.Cbor/IOrdinaryStructureParser.cs index b04ea51..f5197c2 100644 --- a/mROA.Cbor/IOrdinaryStructureParser.cs +++ b/mROA.Cbor/IOrdinaryStructureParser.cs @@ -21,9 +21,7 @@ namespace mROA.Cbor v.Id.WriteToCborInline(writer); // writer.WriteByteString(v.Id.ToByteArray()); writer.WriteInt32(v.CommandId); - writer.WriteStartArray(1); writer.WriteUInt64(v.ObjectId.Flat); - writer.WriteEndArray(); serialization.WriteData(v.Parameters, writer, context); writer.WriteEndArray(); } @@ -48,16 +46,12 @@ namespace mROA.Cbor public static readonly ComplexObjectIdentifierParser Instance = new(); public void Write(CborWriter writer, object value, IEndPointContext context, CborSerializationToolkit serialization) { - writer.WriteStartArray(1); writer.WriteUInt64(((ComplexObjectIdentifier)value).Flat); - writer.WriteEndArray(); } public object Read(CborReader reader, IEndPointContext context, CborSerializationToolkit serialization) { - reader.ReadStartArray(); var value = new ComplexObjectIdentifier { Flat = reader.ReadUInt64() }; - reader.ReadEndArray(); return value; } }