1
0
mirror of https://github.com/JKorf/CryptoExchange.Net synced 2025-07-09 15:39:00 +00:00
This commit is contained in:
Jkorf 2025-06-17 09:43:34 +02:00
parent 7cc0f8a67d
commit a9d72dee4e
9 changed files with 89 additions and 27 deletions

View File

@ -40,6 +40,10 @@ namespace CryptoExchange.Net.Converters.Protobuf
/// The intermediate deserialization object /// The intermediate deserialization object
/// </summary> /// </summary>
protected TIntermediateType? _intermediateType; protected TIntermediateType? _intermediateType;
/// <summary>
/// Runtime type model
/// </summary>
protected RuntimeTypeModel _model;
/// <inheritdoc /> /// <inheritdoc />
public bool IsValid { get; set; } public bool IsValid { get; set; }
@ -48,19 +52,20 @@ namespace CryptoExchange.Net.Converters.Protobuf
public abstract bool OriginalDataAvailable { get; } public abstract bool OriginalDataAvailable { get; }
/// <inheritdoc /> /// <inheritdoc />
public object? Underlying => throw new NotImplementedException(); public object? Underlying => _intermediateType;
/// <summary> /// <summary>
/// ctor /// ctor
/// </summary> /// </summary>
public ProtobufMessageAccessor() public ProtobufMessageAccessor(RuntimeTypeModel model)
{ {
_model = model;
} }
/// <inheritdoc /> /// <inheritdoc />
public NodeType? GetNodeType() public NodeType? GetNodeType()
{ {
throw new Exception(""); throw new NotImplementedException();
} }
/// <inheritdoc /> /// <inheritdoc />
@ -82,7 +87,9 @@ namespace CryptoExchange.Net.Converters.Protobuf
else if (step.Type == 1) else if (step.Type == 1)
{ {
// property value // property value
#pragma warning disable IL2075 // Type is already annotated
value = value.GetType().GetProperty(step.Property!)?.GetValue(value); value = value.GetType().GetProperty(step.Property!)?.GetValue(value);
#pragma warning restore
} }
else else
{ {
@ -136,7 +143,9 @@ namespace CryptoExchange.Net.Converters.Protobuf
else if (step.Type == 1) else if (step.Type == 1)
{ {
// property value // property value
#pragma warning disable IL2075 // Type is already annotated
value = value.GetType().GetProperty(step.Property!)?.GetValue(value); value = value.GetType().GetProperty(step.Property!)?.GetValue(value);
#pragma warning restore
} }
else else
{ {
@ -150,8 +159,7 @@ namespace CryptoExchange.Net.Converters.Protobuf
/// <inheritdoc /> /// <inheritdoc />
public T?[]? GetValues<T>(MessagePath path) public T?[]? GetValues<T>(MessagePath path)
{ {
throw new Exception(""); throw new NotImplementedException();
} }
/// <inheritdoc /> /// <inheritdoc />
@ -161,6 +169,10 @@ namespace CryptoExchange.Net.Converters.Protobuf
public abstract void Clear(); public abstract void Clear();
/// <inheritdoc /> /// <inheritdoc />
#if NET5_0_OR_GREATER
[UnconditionalSuppressMessage("AssemblyLoadTrimming", "IL2092:RequiresUnreferencedCode", Justification = "JsonSerializerOptions provided here has TypeInfoResolver set")]
[UnconditionalSuppressMessage("AssemblyLoadTrimming", "IL2095:RequiresUnreferencedCode", Justification = "JsonSerializerOptions provided here has TypeInfoResolver set")]
#endif
public abstract CallResult<object> Deserialize( public abstract CallResult<object> Deserialize(
#if NET5_0_OR_GREATER #if NET5_0_OR_GREATER
[DynamicallyAccessedMembers( [DynamicallyAccessedMembers(
@ -181,10 +193,13 @@ namespace CryptoExchange.Net.Converters.Protobuf
Type type, MessagePath? path = null); Type type, MessagePath? path = null);
/// <inheritdoc /> /// <inheritdoc />
public abstract CallResult<T> Deserialize<
#if NET5_0_OR_GREATER #if NET5_0_OR_GREATER
[DynamicallyAccessedMembers( [UnconditionalSuppressMessage("AssemblyLoadTrimming", "IL2092:RequiresUnreferencedCode", Justification = "JsonSerializerOptions provided here has TypeInfoResolver set")]
[UnconditionalSuppressMessage("AssemblyLoadTrimming", "IL2095:RequiresUnreferencedCode", Justification = "JsonSerializerOptions provided here has TypeInfoResolver set")]
#endif
public abstract CallResult<T> Deserialize<
#if NET5_0_OR_GREATER
[DynamicallyAccessedMembers(
#if NET8_0_OR_GREATER #if NET8_0_OR_GREATER
DynamicallyAccessedMemberTypes.NonPublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors |
DynamicallyAccessedMemberTypes.PublicFields | DynamicallyAccessedMemberTypes.PublicFields |
@ -232,11 +247,15 @@ namespace CryptoExchange.Net.Converters.Protobuf
/// <summary> /// <summary>
/// ctor /// ctor
/// </summary> /// </summary>
public ProtobufStreamMessageAccessor(): base() public ProtobufStreamMessageAccessor(RuntimeTypeModel model) : base(model)
{ {
} }
/// <inheritdoc /> /// <inheritdoc />
#if NET5_0_OR_GREATER
[UnconditionalSuppressMessage("AssemblyLoadTrimming", "IL2092:RequiresUnreferencedCode", Justification = "JsonSerializerOptions provided here has TypeInfoResolver set")]
[UnconditionalSuppressMessage("AssemblyLoadTrimming", "IL2095:RequiresUnreferencedCode", Justification = "JsonSerializerOptions provided here has TypeInfoResolver set")]
#endif
public override CallResult<object> Deserialize( public override CallResult<object> Deserialize(
#if NET5_0_OR_GREATER #if NET5_0_OR_GREATER
[DynamicallyAccessedMembers( [DynamicallyAccessedMembers(
@ -258,7 +277,7 @@ namespace CryptoExchange.Net.Converters.Protobuf
{ {
try try
{ {
var result = Serializer.Deserialize(type, _stream); var result = _model.Deserialize(type, _stream);
return new CallResult<object>(result); return new CallResult<object>(result);
} }
catch (Exception ex) catch (Exception ex)
@ -268,6 +287,10 @@ namespace CryptoExchange.Net.Converters.Protobuf
} }
/// <inheritdoc /> /// <inheritdoc />
#if NET5_0_OR_GREATER
[UnconditionalSuppressMessage("AssemblyLoadTrimming", "IL2092:RequiresUnreferencedCode", Justification = "JsonSerializerOptions provided here has TypeInfoResolver set")]
[UnconditionalSuppressMessage("AssemblyLoadTrimming", "IL2095:RequiresUnreferencedCode", Justification = "JsonSerializerOptions provided here has TypeInfoResolver set")]
#endif
public override CallResult<T> Deserialize< public override CallResult<T> Deserialize<
#if NET5_0_OR_GREATER #if NET5_0_OR_GREATER
[DynamicallyAccessedMembers( [DynamicallyAccessedMembers(
@ -289,7 +312,7 @@ namespace CryptoExchange.Net.Converters.Protobuf
{ {
try try
{ {
var result = Serializer.Deserialize<T>(_stream); var result = _model.Deserialize<T>(_stream);
return new CallResult<T>(result); return new CallResult<T>(result);
} }
catch(Exception ex) catch(Exception ex)
@ -320,7 +343,7 @@ namespace CryptoExchange.Net.Converters.Protobuf
try try
{ {
_intermediateType = Serializer.Deserialize<TIntermediate>(_stream); _intermediateType = _model.Deserialize<TIntermediate>(_stream);
IsValid = true; IsValid = true;
return Task.FromResult(CallResult.SuccessResult); return Task.FromResult(CallResult.SuccessResult);
} }
@ -328,7 +351,7 @@ namespace CryptoExchange.Net.Converters.Protobuf
{ {
// Not a json message // Not a json message
IsValid = false; IsValid = false;
return Task.FromResult(new CallResult(new DeserializeError("JsonError: " + ex.Message, ex))); return Task.FromResult(new CallResult(new DeserializeError("ProtoBufError: " + ex.Message, ex)));
} }
} }
@ -380,11 +403,15 @@ namespace CryptoExchange.Net.Converters.Protobuf
/// <summary> /// <summary>
/// ctor /// ctor
/// </summary> /// </summary>
public ProtobufByteMessageAccessor() : base() public ProtobufByteMessageAccessor(RuntimeTypeModel model) : base(model)
{ {
} }
/// <inheritdoc /> /// <inheritdoc />
#if NET5_0_OR_GREATER
[UnconditionalSuppressMessage("AssemblyLoadTrimming", "IL2092:RequiresUnreferencedCode", Justification = "JsonSerializerOptions provided here has TypeInfoResolver set")]
[UnconditionalSuppressMessage("AssemblyLoadTrimming", "IL2095:RequiresUnreferencedCode", Justification = "JsonSerializerOptions provided here has TypeInfoResolver set")]
#endif
public override CallResult<object> Deserialize( public override CallResult<object> Deserialize(
#if NET5_0_OR_GREATER #if NET5_0_OR_GREATER
[DynamicallyAccessedMembers( [DynamicallyAccessedMembers(
@ -408,7 +435,7 @@ namespace CryptoExchange.Net.Converters.Protobuf
{ {
using var stream = new MemoryStream(_bytes.ToArray()); using var stream = new MemoryStream(_bytes.ToArray());
stream.Position = 0; stream.Position = 0;
var result = Serializer.Deserialize(type, stream); var result = _model.Deserialize(type, stream);
return new CallResult<object>(result); return new CallResult<object>(result);
} }
catch (Exception ex) catch (Exception ex)
@ -418,6 +445,10 @@ namespace CryptoExchange.Net.Converters.Protobuf
} }
/// <inheritdoc /> /// <inheritdoc />
#if NET5_0_OR_GREATER
[UnconditionalSuppressMessage("AssemblyLoadTrimming", "IL2092:RequiresUnreferencedCode", Justification = "JsonSerializerOptions provided here has TypeInfoResolver set")]
[UnconditionalSuppressMessage("AssemblyLoadTrimming", "IL2095:RequiresUnreferencedCode", Justification = "JsonSerializerOptions provided here has TypeInfoResolver set")]
#endif
#if NET5_0_OR_GREATER #if NET5_0_OR_GREATER
public override CallResult<T> Deserialize< public override CallResult<T> Deserialize<
[DynamicallyAccessedMembers( [DynamicallyAccessedMembers(
@ -441,7 +472,7 @@ namespace CryptoExchange.Net.Converters.Protobuf
{ {
try try
{ {
var result = Serializer.Deserialize<T>(_bytes); var result = _model.Deserialize<T>(_bytes);
return new CallResult<T>(result); return new CallResult<T>(result);
} }
catch (Exception ex) catch (Exception ex)
@ -457,7 +488,7 @@ namespace CryptoExchange.Net.Converters.Protobuf
try try
{ {
_intermediateType = Serializer.Deserialize<TIntermediate>(data); _intermediateType = _model.Deserialize<TIntermediate>(data);
IsValid = true; IsValid = true;
return CallResult.SuccessResult; return CallResult.SuccessResult;
} }

View File

@ -9,17 +9,21 @@ namespace CryptoExchange.Net.Converters.Protobuf
/// <inheritdoc /> /// <inheritdoc />
public class ProtobufMessageSerializer : IByteMessageSerializer public class ProtobufMessageSerializer : IByteMessageSerializer
{ {
private readonly RuntimeTypeModel _model = RuntimeTypeModel.Create("CryptoExchange"); private RuntimeTypeModel _model;
/// <summary> /// <summary>
/// ctor /// ctor
/// </summary> /// </summary>
public ProtobufMessageSerializer() public ProtobufMessageSerializer(RuntimeTypeModel model)
{ {
_model.UseImplicitZeroDefaults = false; _model = model;
} }
/// <inheritdoc /> /// <inheritdoc />
#if NET5_0_OR_GREATER
[UnconditionalSuppressMessage("AssemblyLoadTrimming", "IL2092:RequiresUnreferencedCode", Justification = "JsonSerializerOptions provided here has TypeInfoResolver set")]
[UnconditionalSuppressMessage("AssemblyLoadTrimming", "IL2095:RequiresUnreferencedCode", Justification = "JsonSerializerOptions provided here has TypeInfoResolver set")]
#endif
#if NET5_0_OR_GREATER #if NET5_0_OR_GREATER
public byte[] Serialize< public byte[] Serialize<
[DynamicallyAccessedMembers( [DynamicallyAccessedMembers(

View File

@ -29,6 +29,9 @@
<None Include="..\CryptoExchange.Net\Icon\icon.png" Pack="true" PackagePath="\" /> <None Include="..\CryptoExchange.Net\Icon\icon.png" Pack="true" PackagePath="\" />
<None Include="README.md" Pack="true" PackagePath="\" /> <None Include="README.md" Pack="true" PackagePath="\" />
</ItemGroup> </ItemGroup>
<PropertyGroup Label="AOT" Condition="$([MSBuild]::IsTargetFrameworkCompatible('$(TargetFramework)', 'net7.0'))">
<IsAotCompatible>true</IsAotCompatible>
</PropertyGroup>
<PropertyGroup Label="Deterministic Build" Condition="'$(Configuration)' == 'Release'"> <PropertyGroup Label="Deterministic Build" Condition="'$(Configuration)' == 'Release'">
<PublishRepositoryUrl>true</PublishRepositoryUrl> <PublishRepositoryUrl>true</PublishRepositoryUrl>
<IncludeSymbols>true</IncludeSymbols> <IncludeSymbols>true</IncludeSymbols>
@ -39,6 +42,9 @@
<PropertyGroup> <PropertyGroup>
<DocumentationFile>CryptoExchange.Net.Protobuf.xml</DocumentationFile> <DocumentationFile>CryptoExchange.Net.Protobuf.xml</DocumentationFile>
</PropertyGroup> </PropertyGroup>
<ItemGroup>
<PackageReference Include="protobuf-net" Version="3.2.52" />
</ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\CryptoExchange.Net\CryptoExchange.Net.csproj" /> <ProjectReference Include="..\CryptoExchange.Net\CryptoExchange.Net.csproj" />

View File

@ -14,6 +14,11 @@
The intermediate deserialization object The intermediate deserialization object
</summary> </summary>
</member> </member>
<member name="F:CryptoExchange.Net.Converters.Protobuf.ProtobufMessageAccessor`1._model">
<summary>
Runtime type model
</summary>
</member>
<member name="P:CryptoExchange.Net.Converters.Protobuf.ProtobufMessageAccessor`1.IsValid"> <member name="P:CryptoExchange.Net.Converters.Protobuf.ProtobufMessageAccessor`1.IsValid">
<inheritdoc /> <inheritdoc />
</member> </member>
@ -23,7 +28,7 @@
<member name="P:CryptoExchange.Net.Converters.Protobuf.ProtobufMessageAccessor`1.Underlying"> <member name="P:CryptoExchange.Net.Converters.Protobuf.ProtobufMessageAccessor`1.Underlying">
<inheritdoc /> <inheritdoc />
</member> </member>
<member name="M:CryptoExchange.Net.Converters.Protobuf.ProtobufMessageAccessor`1.#ctor"> <member name="M:CryptoExchange.Net.Converters.Protobuf.ProtobufMessageAccessor`1.#ctor(ProtoBuf.Meta.RuntimeTypeModel)">
<summary> <summary>
ctor ctor
</summary> </summary>
@ -60,7 +65,7 @@
<member name="P:CryptoExchange.Net.Converters.Protobuf.ProtobufStreamMessageAccessor`1.OriginalDataAvailable"> <member name="P:CryptoExchange.Net.Converters.Protobuf.ProtobufStreamMessageAccessor`1.OriginalDataAvailable">
<inheritdoc /> <inheritdoc />
</member> </member>
<member name="M:CryptoExchange.Net.Converters.Protobuf.ProtobufStreamMessageAccessor`1.#ctor"> <member name="M:CryptoExchange.Net.Converters.Protobuf.ProtobufStreamMessageAccessor`1.#ctor(ProtoBuf.Meta.RuntimeTypeModel)">
<summary> <summary>
ctor ctor
</summary> </summary>
@ -85,7 +90,7 @@
Protobuf byte message accessor Protobuf byte message accessor
</summary> </summary>
</member> </member>
<member name="M:CryptoExchange.Net.Converters.Protobuf.ProtobufByteMessageAccessor`1.#ctor"> <member name="M:CryptoExchange.Net.Converters.Protobuf.ProtobufByteMessageAccessor`1.#ctor(ProtoBuf.Meta.RuntimeTypeModel)">
<summary> <summary>
ctor ctor
</summary> </summary>
@ -111,7 +116,7 @@
<member name="T:CryptoExchange.Net.Converters.Protobuf.ProtobufMessageSerializer"> <member name="T:CryptoExchange.Net.Converters.Protobuf.ProtobufMessageSerializer">
<inheritdoc /> <inheritdoc />
</member> </member>
<member name="M:CryptoExchange.Net.Converters.Protobuf.ProtobufMessageSerializer.#ctor"> <member name="M:CryptoExchange.Net.Converters.Protobuf.ProtobufMessageSerializer.#ctor(ProtoBuf.Meta.RuntimeTypeModel)">
<summary> <summary>
ctor ctor
</summary> </summary>

View File

@ -17,6 +17,7 @@ using CryptoExchange.Net.Testing.Implementations;
using CryptoExchange.Net.SharedApis; using CryptoExchange.Net.SharedApis;
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;
using CryptoExchange.Net.Converters.SystemTextJson; using CryptoExchange.Net.Converters.SystemTextJson;
using System.Net.WebSockets;
namespace CryptoExchange.Net.UnitTests.TestImplementations namespace CryptoExchange.Net.UnitTests.TestImplementations
{ {
@ -98,7 +99,7 @@ namespace CryptoExchange.Net.UnitTests.TestImplementations
} }
protected internal override IByteMessageAccessor CreateAccessor() => new SystemTextJsonByteMessageAccessor(new System.Text.Json.JsonSerializerOptions()); protected internal override IByteMessageAccessor CreateAccessor(WebSocketMessageType type) => new SystemTextJsonByteMessageAccessor(new System.Text.Json.JsonSerializerOptions());
protected internal override IMessageSerializer CreateSerializer() => new SystemTextJsonMessageSerializer(new System.Text.Json.JsonSerializerOptions()); protected internal override IMessageSerializer CreateSerializer() => new SystemTextJsonMessageSerializer(new System.Text.Json.JsonSerializerOptions());
/// <inheritdoc /> /// <inheritdoc />

View File

@ -16,7 +16,6 @@ using CryptoExchange.Net.RateLimiting;
using CryptoExchange.Net.RateLimiting.Interfaces; using CryptoExchange.Net.RateLimiting.Interfaces;
using CryptoExchange.Net.Requests; using CryptoExchange.Net.Requests;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using ProtoBuf;
namespace CryptoExchange.Net.Clients namespace CryptoExchange.Net.Clients
{ {

View File

@ -52,7 +52,6 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Microsoft.Extensions.Logging" Version="9.0.6" /> <PackageReference Include="Microsoft.Extensions.Logging" Version="9.0.6" />
<PackageReference Include="protobuf-net" Version="3.2.52" />
<PackageReference Include="System.Text.Json" Version="9.0.6" /> <PackageReference Include="System.Text.Json" Version="9.0.6" />
</ItemGroup> </ItemGroup>
<ItemGroup Label="Transitive Client Packages"> <ItemGroup Label="Transitive Client Packages">

View File

@ -2,6 +2,7 @@
using CryptoExchange.Net.Objects; using CryptoExchange.Net.Objects;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.IO; using System.IO;
using System.Threading.Tasks; using System.Threading.Tasks;
@ -59,12 +60,20 @@ namespace CryptoExchange.Net.Interfaces
/// <param name="type"></param> /// <param name="type"></param>
/// <param name="path"></param> /// <param name="path"></param>
/// <returns></returns> /// <returns></returns>
#if NET5_0_OR_GREATER
[UnconditionalSuppressMessage("AssemblyLoadTrimming", "IL2092:RequiresUnreferencedCode", Justification = "JsonSerializerOptions provided here has TypeInfoResolver set")]
[UnconditionalSuppressMessage("AssemblyLoadTrimming", "IL2095:RequiresUnreferencedCode", Justification = "JsonSerializerOptions provided here has TypeInfoResolver set")]
#endif
CallResult<object> Deserialize(Type type, MessagePath? path = null); CallResult<object> Deserialize(Type type, MessagePath? path = null);
/// <summary> /// <summary>
/// Deserialize the message into this type /// Deserialize the message into this type
/// </summary> /// </summary>
/// <param name="path"></param> /// <param name="path"></param>
/// <returns></returns> /// <returns></returns>
#if NET5_0_OR_GREATER
[UnconditionalSuppressMessage("AssemblyLoadTrimming", "IL2092:RequiresUnreferencedCode", Justification = "JsonSerializerOptions provided here has TypeInfoResolver set")]
[UnconditionalSuppressMessage("AssemblyLoadTrimming", "IL2095:RequiresUnreferencedCode", Justification = "JsonSerializerOptions provided here has TypeInfoResolver set")]
#endif
CallResult<T> Deserialize<T>(MessagePath? path = null); CallResult<T> Deserialize<T>(MessagePath? path = null);
/// <summary> /// <summary>

View File

@ -480,6 +480,14 @@ namespace CryptoExchange.Net.Sockets
_logger.FailedToParse(SocketId, result.Error!.Message); _logger.FailedToParse(SocketId, result.Error!.Message);
return; return;
} }
else
{
try
{
_logger.LogInformation("Valid: " + accessor.Underlying);
}
catch (Exception) { }
}
// 3. Determine the identifying properties of this message // 3. Determine the identifying properties of this message
var listenId = ApiClient.GetListenerIdentifier(accessor); var listenId = ApiClient.GetListenerIdentifier(accessor);