Переписывание на UniversalObjectIdentifier. Часть 1

This commit is contained in:
2025-03-01 15:54:01 +03:00
parent 3c88e4f768
commit af65f22aa9
7 changed files with 80 additions and 11 deletions
+1 -1
View File
@@ -15,7 +15,7 @@
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)' == 'Debug' "> <PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
<DefineConstants>TRACE;</DefineConstants> <DefineConstants></DefineConstants>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
+1 -1
View File
@@ -14,7 +14,7 @@
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)' == 'Release' "> <PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
<DefineConstants>TRACE;</DefineConstants> <DefineConstants></DefineConstants>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
+2
View File
@@ -12,6 +12,7 @@ namespace mROA.Cbor
{ {
public class CborSerializationToolkit : IContextualSerializationToolKit public class CborSerializationToolkit : IContextualSerializationToolKit
{ {
private List<Type> _remoteTypes;
public byte[] Serialize(object objectToSerialize, IEndPointContext context) public byte[] Serialize(object objectToSerialize, IEndPointContext context)
{ {
var writer = new CborWriter(); var writer = new CborWriter();
@@ -352,6 +353,7 @@ namespace mROA.Cbor
public void Inject<T>(T dependency) public void Inject<T>(T dependency)
{ {
_remoteTypes = RemoteContextRepository.RemoteTypes.Keys.ToList();
} }
public byte[] Serialize<T>(T objectToSerialize) public byte[] Serialize<T>(T objectToSerialize)
+26
View File
@@ -0,0 +1,26 @@
using mROA.Implementation;
namespace mROA.Test;
public class UnSOization
{
private UniversalObjectIdentifier _uoi;
[SetUp]
public void Setup()
{
_uoi = new UniversalObjectIdentifier
{
ContextId = -123, OwnerId = 123
};
}
[Test]
public void FlatTest()
{
var flat = _uoi.Flat;
var next = new UniversalObjectIdentifier { Flat = flat };
Assert.That(_uoi, Is.EqualTo(next));
}
}
+8 -8
View File
@@ -10,23 +10,23 @@ namespace mROA.Implementation
{ {
public abstract class RemoteObjectBase : IDisposable public abstract class RemoteObjectBase : IDisposable
{ {
private readonly int _id; private readonly UniversalObjectIdentifier _identifier;
private readonly IRepresentationModule _representationModule; private readonly IRepresentationModule _representationModule;
protected RemoteObjectBase(int id, IRepresentationModule representationModule) protected RemoteObjectBase(int id, IRepresentationModule representationModule)
{ {
_id = id; _identifier = new UniversalObjectIdentifier { ContextId = id, OwnerId = representationModule.Id };
_representationModule = representationModule; _representationModule = representationModule;
} }
public int Id => _id; public int Id => _identifier.ContextId;
public int OwnerId => _representationModule.Id; public int OwnerId => _identifier.OwnerId;
protected async Task<T> GetResultAsync<T>(int methodId, object? parameter = default, protected async Task<T> GetResultAsync<T>(int methodId, object? parameter = default,
CancellationToken cancellationToken = default) CancellationToken cancellationToken = default)
{ {
var request = new DefaultCallRequest var request = new DefaultCallRequest
{ CommandId = methodId, ObjectId = _id, Parameter = parameter { CommandId = methodId, ObjectId = _identifier.ContextId, Parameter = parameter
}; };
await _representationModule.PostCallMessageAsync(request.Id, MessageType.CallRequest, request); await _representationModule.PostCallMessageAsync(request.Id, MessageType.CallRequest, request);
@@ -80,7 +80,7 @@ namespace mROA.Implementation
CancellationToken cancellationToken = default) CancellationToken cancellationToken = default)
{ {
var request = new DefaultCallRequest var request = new DefaultCallRequest
{ CommandId = methodId, ObjectId = _id, Parameter = parameter { CommandId = methodId, ObjectId = _identifier.ContextId, Parameter = parameter
}; };
await _representationModule.PostCallMessageAsync(request.Id, MessageType.CallRequest, request); await _representationModule.PostCallMessageAsync(request.Id, MessageType.CallRequest, request);
@@ -124,14 +124,14 @@ namespace mROA.Implementation
public void Dispose() public void Dispose()
{ {
if (_id == -1) if (_identifier.IsStatic)
return; return;
CallAsync(-1).Wait(); CallAsync(-1).Wait();
} }
public override string ToString() public override string ToString()
{ {
return $"{{Id : {_id}, OwnerId : {OwnerId} }}"; return _identifier.ToString();
} }
} }
} }
+41
View File
@@ -121,4 +121,45 @@ namespace mROA.Implementation
public static implicit operator SharedObject<T>(T value) => public static implicit operator SharedObject<T>(T value) =>
new(value); new(value);
} }
public struct UniversalObjectIdentifier : IEquatable<UniversalObjectIdentifier>
{
public int ContextId;
public int OwnerId;
public override string ToString()
{
return $"{nameof(ContextId)}: {ContextId}, {nameof(OwnerId)}: {OwnerId}";
}
public bool IsStatic => ContextId == -1;
public ulong Flat
{
get
{
return (ulong)OwnerId << 32 | (uint)ContextId;
}
set
{
OwnerId = (int)(value >> 32);
ContextId = (int)(value & 0xFFFFFFFF);
}
}
public bool Equals(UniversalObjectIdentifier other)
{
return ContextId == other.ContextId && OwnerId == other.OwnerId;
}
public override bool Equals(object? obj)
{
return obj is UniversalObjectIdentifier other && Equals(other);
}
public override int GetHashCode()
{
return HashCode.Combine(ContextId, OwnerId);
}
}
} }
+1 -1
View File
@@ -21,7 +21,7 @@
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)' == 'Debug' "> <PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
<DefineConstants>TRACE;</DefineConstants> <DefineConstants></DefineConstants>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>