mirror of
https://github.com/JKorf/CryptoExchange.Net.git
synced 2026-08-11 16:32:57 +00:00
Removed deprecated Protobuf separate project
This commit is contained in:
@@ -1,530 +0,0 @@
|
|||||||
using CryptoExchange.Net.Converters.MessageParsing;
|
|
||||||
using CryptoExchange.Net.Interfaces;
|
|
||||||
using CryptoExchange.Net.Objects;
|
|
||||||
using ProtoBuf;
|
|
||||||
using ProtoBuf.Meta;
|
|
||||||
using System;
|
|
||||||
using System.Diagnostics.CodeAnalysis;
|
|
||||||
using System.IO;
|
|
||||||
using System.Runtime.InteropServices.ComTypes;
|
|
||||||
using System.Text;
|
|
||||||
using System.Text.Json;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace CryptoExchange.Net.Converters.Protobuf
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// System.Text.Json message accessor
|
|
||||||
/// </summary>
|
|
||||||
#if NET5_0_OR_GREATER
|
|
||||||
public abstract class ProtobufMessageAccessor<
|
|
||||||
[DynamicallyAccessedMembers(
|
|
||||||
#if NET8_0_OR_GREATER
|
|
||||||
DynamicallyAccessedMemberTypes.NonPublicConstructors |
|
|
||||||
DynamicallyAccessedMemberTypes.PublicFields |
|
|
||||||
DynamicallyAccessedMemberTypes.NonPublicFields |
|
|
||||||
DynamicallyAccessedMemberTypes.NonPublicNestedTypes |
|
|
||||||
DynamicallyAccessedMemberTypes.PublicProperties |
|
|
||||||
DynamicallyAccessedMemberTypes.NonPublicProperties |
|
|
||||||
#endif
|
|
||||||
DynamicallyAccessedMemberTypes.PublicNestedTypes |
|
|
||||||
DynamicallyAccessedMemberTypes.NonPublicMethods |
|
|
||||||
DynamicallyAccessedMemberTypes.PublicMethods
|
|
||||||
)]
|
|
||||||
TIntermediateType> : IMessageAccessor
|
|
||||||
#else
|
|
||||||
public abstract class ProtobufMessageAccessor<TIntermediateType> : IMessageAccessor
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// The intermediate deserialization object
|
|
||||||
/// </summary>
|
|
||||||
protected TIntermediateType? _intermediateType;
|
|
||||||
/// <summary>
|
|
||||||
/// Runtime type model
|
|
||||||
/// </summary>
|
|
||||||
protected RuntimeTypeModel _model;
|
|
||||||
|
|
||||||
/// <inheritdoc />
|
|
||||||
public bool IsValid { get; set; }
|
|
||||||
|
|
||||||
/// <inheritdoc />
|
|
||||||
public abstract bool OriginalDataAvailable { get; }
|
|
||||||
|
|
||||||
/// <inheritdoc />
|
|
||||||
public object? Underlying => _intermediateType;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// ctor
|
|
||||||
/// </summary>
|
|
||||||
public ProtobufMessageAccessor(RuntimeTypeModel model)
|
|
||||||
{
|
|
||||||
_model = model;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <inheritdoc />
|
|
||||||
public NodeType? GetNodeType()
|
|
||||||
{
|
|
||||||
throw new NotImplementedException();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <inheritdoc />
|
|
||||||
public NodeType? GetNodeType(MessagePath path)
|
|
||||||
{
|
|
||||||
if (_intermediateType == null)
|
|
||||||
throw new InvalidOperationException("Data not read");
|
|
||||||
|
|
||||||
object? value = _intermediateType;
|
|
||||||
foreach (var step in path)
|
|
||||||
{
|
|
||||||
if (value == null)
|
|
||||||
break;
|
|
||||||
|
|
||||||
if (step.Type == 0)
|
|
||||||
{
|
|
||||||
// array index
|
|
||||||
}
|
|
||||||
else if (step.Type == 1)
|
|
||||||
{
|
|
||||||
// property value
|
|
||||||
#pragma warning disable IL2075 // Type is already annotated
|
|
||||||
value = value.GetType().GetProperty(step.Property!)?.GetValue(value);
|
|
||||||
#pragma warning restore
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// property name
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (value == null)
|
|
||||||
return null;
|
|
||||||
|
|
||||||
var valueType = value.GetType();
|
|
||||||
if (valueType.IsArray)
|
|
||||||
return NodeType.Array;
|
|
||||||
|
|
||||||
if (IsSimple(valueType))
|
|
||||||
return NodeType.Value;
|
|
||||||
|
|
||||||
return NodeType.Object;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static bool IsSimple(Type type)
|
|
||||||
{
|
|
||||||
if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>))
|
|
||||||
{
|
|
||||||
// nullable type, check if the nested type is simple.
|
|
||||||
return IsSimple(type.GetGenericArguments()[0]);
|
|
||||||
}
|
|
||||||
return type.IsPrimitive
|
|
||||||
|| type.IsEnum
|
|
||||||
|| type == typeof(string)
|
|
||||||
|| type == typeof(decimal);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/// <inheritdoc />
|
|
||||||
#if NET5_0_OR_GREATER
|
|
||||||
[UnconditionalSuppressMessage("AssemblyLoadTrimming", "IL2075:RequiresUnreferencedCode", Justification = "JsonSerializerOptions provided here has TypeInfoResolver set")]
|
|
||||||
#endif
|
|
||||||
public T? GetValue<T>(MessagePath path)
|
|
||||||
{
|
|
||||||
if (_intermediateType == null)
|
|
||||||
throw new InvalidOperationException("Data not read");
|
|
||||||
|
|
||||||
object? value = _intermediateType;
|
|
||||||
foreach(var step in path)
|
|
||||||
{
|
|
||||||
if (value == null)
|
|
||||||
break;
|
|
||||||
|
|
||||||
if (step.Type == 0)
|
|
||||||
{
|
|
||||||
// array index
|
|
||||||
}
|
|
||||||
else if (step.Type == 1)
|
|
||||||
{
|
|
||||||
// property value
|
|
||||||
#pragma warning disable IL2075 // Type is already annotated
|
|
||||||
value = value.GetType().GetProperty(step.Property!)?.GetValue(value);
|
|
||||||
#pragma warning restore
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// property name
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return (T?)value;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <inheritdoc />
|
|
||||||
public T?[]? GetValues<T>(MessagePath path)
|
|
||||||
{
|
|
||||||
throw new NotImplementedException();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <inheritdoc />
|
|
||||||
public abstract string GetOriginalString();
|
|
||||||
|
|
||||||
/// <inheritdoc />
|
|
||||||
public abstract void Clear();
|
|
||||||
|
|
||||||
/// <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(
|
|
||||||
#if NET5_0_OR_GREATER
|
|
||||||
[DynamicallyAccessedMembers(
|
|
||||||
#if NET8_0_OR_GREATER
|
|
||||||
DynamicallyAccessedMemberTypes.NonPublicConstructors |
|
|
||||||
DynamicallyAccessedMemberTypes.PublicFields |
|
|
||||||
DynamicallyAccessedMemberTypes.NonPublicFields |
|
|
||||||
DynamicallyAccessedMemberTypes.NonPublicNestedTypes |
|
|
||||||
DynamicallyAccessedMemberTypes.PublicProperties |
|
|
||||||
DynamicallyAccessedMemberTypes.NonPublicProperties |
|
|
||||||
DynamicallyAccessedMemberTypes.PublicConstructors |
|
|
||||||
#endif
|
|
||||||
DynamicallyAccessedMemberTypes.PublicNestedTypes |
|
|
||||||
DynamicallyAccessedMemberTypes.NonPublicMethods |
|
|
||||||
DynamicallyAccessedMemberTypes.PublicMethods
|
|
||||||
)]
|
|
||||||
#endif
|
|
||||||
Type type, MessagePath? path = null);
|
|
||||||
|
|
||||||
/// <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<T> Deserialize<
|
|
||||||
#if NET5_0_OR_GREATER
|
|
||||||
[DynamicallyAccessedMembers(
|
|
||||||
#if NET8_0_OR_GREATER
|
|
||||||
DynamicallyAccessedMemberTypes.NonPublicConstructors |
|
|
||||||
DynamicallyAccessedMemberTypes.PublicFields |
|
|
||||||
DynamicallyAccessedMemberTypes.NonPublicFields |
|
|
||||||
DynamicallyAccessedMemberTypes.NonPublicNestedTypes |
|
|
||||||
DynamicallyAccessedMemberTypes.PublicProperties |
|
|
||||||
DynamicallyAccessedMemberTypes.NonPublicProperties |
|
|
||||||
DynamicallyAccessedMemberTypes.PublicConstructors |
|
|
||||||
#endif
|
|
||||||
DynamicallyAccessedMemberTypes.PublicNestedTypes |
|
|
||||||
DynamicallyAccessedMemberTypes.NonPublicMethods |
|
|
||||||
DynamicallyAccessedMemberTypes.PublicMethods
|
|
||||||
)]
|
|
||||||
#endif
|
|
||||||
T>(MessagePath? path = null);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// System.Text.Json stream message accessor
|
|
||||||
/// </summary>
|
|
||||||
public class ProtobufStreamMessageAccessor<
|
|
||||||
#if NET5_0_OR_GREATER
|
|
||||||
[DynamicallyAccessedMembers(
|
|
||||||
#if NET8_0_OR_GREATER
|
|
||||||
DynamicallyAccessedMemberTypes.NonPublicConstructors |
|
|
||||||
DynamicallyAccessedMemberTypes.PublicFields |
|
|
||||||
DynamicallyAccessedMemberTypes.NonPublicFields |
|
|
||||||
DynamicallyAccessedMemberTypes.NonPublicNestedTypes |
|
|
||||||
DynamicallyAccessedMemberTypes.PublicProperties |
|
|
||||||
DynamicallyAccessedMemberTypes.NonPublicProperties |
|
|
||||||
DynamicallyAccessedMemberTypes.PublicConstructors |
|
|
||||||
#endif
|
|
||||||
DynamicallyAccessedMemberTypes.PublicNestedTypes |
|
|
||||||
DynamicallyAccessedMemberTypes.NonPublicMethods |
|
|
||||||
DynamicallyAccessedMemberTypes.PublicMethods
|
|
||||||
)]
|
|
||||||
#endif
|
|
||||||
TIntermediate> : ProtobufMessageAccessor<TIntermediate>, IStreamMessageAccessor
|
|
||||||
{
|
|
||||||
private Stream? _stream;
|
|
||||||
|
|
||||||
/// <inheritdoc />
|
|
||||||
public override bool OriginalDataAvailable => _stream?.CanSeek == true;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// ctor
|
|
||||||
/// </summary>
|
|
||||||
public ProtobufStreamMessageAccessor(RuntimeTypeModel model) : base(model)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <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(
|
|
||||||
#if NET5_0_OR_GREATER
|
|
||||||
[DynamicallyAccessedMembers(
|
|
||||||
#if NET8_0_OR_GREATER
|
|
||||||
DynamicallyAccessedMemberTypes.NonPublicConstructors |
|
|
||||||
DynamicallyAccessedMemberTypes.PublicFields |
|
|
||||||
DynamicallyAccessedMemberTypes.NonPublicFields |
|
|
||||||
DynamicallyAccessedMemberTypes.NonPublicNestedTypes |
|
|
||||||
DynamicallyAccessedMemberTypes.PublicProperties |
|
|
||||||
DynamicallyAccessedMemberTypes.NonPublicProperties |
|
|
||||||
DynamicallyAccessedMemberTypes.PublicConstructors |
|
|
||||||
#endif
|
|
||||||
DynamicallyAccessedMemberTypes.PublicNestedTypes |
|
|
||||||
DynamicallyAccessedMemberTypes.NonPublicMethods |
|
|
||||||
DynamicallyAccessedMemberTypes.PublicMethods
|
|
||||||
)]
|
|
||||||
#endif
|
|
||||||
Type type, MessagePath? path = null)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
var result = _model.Deserialize(type, _stream);
|
|
||||||
return new CallResult<object>(result);
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
return new CallResult<object>(new DeserializeError("Protobuf deserialization failed: " + ex.Message, ex));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <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<
|
|
||||||
#if NET5_0_OR_GREATER
|
|
||||||
[DynamicallyAccessedMembers(
|
|
||||||
#if NET8_0_OR_GREATER
|
|
||||||
DynamicallyAccessedMemberTypes.NonPublicConstructors |
|
|
||||||
DynamicallyAccessedMemberTypes.PublicFields |
|
|
||||||
DynamicallyAccessedMemberTypes.NonPublicFields |
|
|
||||||
DynamicallyAccessedMemberTypes.NonPublicNestedTypes |
|
|
||||||
DynamicallyAccessedMemberTypes.PublicProperties |
|
|
||||||
DynamicallyAccessedMemberTypes.NonPublicProperties |
|
|
||||||
DynamicallyAccessedMemberTypes.PublicConstructors |
|
|
||||||
#endif
|
|
||||||
DynamicallyAccessedMemberTypes.PublicNestedTypes |
|
|
||||||
DynamicallyAccessedMemberTypes.NonPublicMethods |
|
|
||||||
DynamicallyAccessedMemberTypes.PublicMethods
|
|
||||||
)]
|
|
||||||
#endif
|
|
||||||
T>(MessagePath? path = null)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
var result = _model.Deserialize<T>(_stream);
|
|
||||||
return new CallResult<T>(result);
|
|
||||||
}
|
|
||||||
catch(Exception ex)
|
|
||||||
{
|
|
||||||
return new CallResult<T>(new DeserializeError("Protobuf deserialization failed: " + ex.Message, ex));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <inheritdoc />
|
|
||||||
public Task<CallResult> Read(Stream stream, bool bufferStream)
|
|
||||||
{
|
|
||||||
if (bufferStream && stream is not MemoryStream)
|
|
||||||
{
|
|
||||||
// We need to be buffer the stream, and it's not currently a seekable stream, so copy it to a new memory stream
|
|
||||||
_stream = new MemoryStream();
|
|
||||||
stream.CopyTo(_stream);
|
|
||||||
_stream.Position = 0;
|
|
||||||
}
|
|
||||||
else if (bufferStream)
|
|
||||||
{
|
|
||||||
// We need to buffer the stream, and the current stream is seekable, store as is
|
|
||||||
_stream = stream;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// We don't need to buffer the stream, so don't bother keeping the reference
|
|
||||||
}
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
_intermediateType = _model.Deserialize<TIntermediate>(_stream);
|
|
||||||
IsValid = true;
|
|
||||||
return Task.FromResult(CallResult.SuccessResult);
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
// Not a json message
|
|
||||||
IsValid = false;
|
|
||||||
return Task.FromResult(new CallResult(new DeserializeError("Protobuf deserialization failed: " + ex.Message, ex)));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <inheritdoc />
|
|
||||||
public override string GetOriginalString()
|
|
||||||
{
|
|
||||||
if (_stream is null)
|
|
||||||
throw new NullReferenceException("Stream not initialized");
|
|
||||||
|
|
||||||
_stream.Position = 0;
|
|
||||||
using var textReader = new StreamReader(_stream, Encoding.UTF8, false, 1024, true);
|
|
||||||
return textReader.ReadToEnd();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <inheritdoc />
|
|
||||||
public override void Clear()
|
|
||||||
{
|
|
||||||
_stream?.Dispose();
|
|
||||||
_stream = null;
|
|
||||||
_intermediateType = default;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Protobuf byte message accessor
|
|
||||||
/// </summary>
|
|
||||||
public class ProtobufByteMessageAccessor<
|
|
||||||
#if NET5_0_OR_GREATER
|
|
||||||
[DynamicallyAccessedMembers(
|
|
||||||
#if NET8_0_OR_GREATER
|
|
||||||
DynamicallyAccessedMemberTypes.NonPublicConstructors |
|
|
||||||
DynamicallyAccessedMemberTypes.PublicFields |
|
|
||||||
DynamicallyAccessedMemberTypes.NonPublicFields |
|
|
||||||
DynamicallyAccessedMemberTypes.NonPublicNestedTypes |
|
|
||||||
DynamicallyAccessedMemberTypes.PublicProperties |
|
|
||||||
DynamicallyAccessedMemberTypes.NonPublicProperties |
|
|
||||||
DynamicallyAccessedMemberTypes.PublicConstructors |
|
|
||||||
#endif
|
|
||||||
DynamicallyAccessedMemberTypes.PublicNestedTypes |
|
|
||||||
DynamicallyAccessedMemberTypes.NonPublicMethods |
|
|
||||||
DynamicallyAccessedMemberTypes.PublicMethods
|
|
||||||
)]
|
|
||||||
#endif
|
|
||||||
TIntermediate> : ProtobufMessageAccessor<TIntermediate>, IByteMessageAccessor
|
|
||||||
{
|
|
||||||
private ReadOnlyMemory<byte> _bytes;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// ctor
|
|
||||||
/// </summary>
|
|
||||||
public ProtobufByteMessageAccessor(RuntimeTypeModel model) : base(model)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <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(
|
|
||||||
|
|
||||||
#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")]
|
|
||||||
[DynamicallyAccessedMembers(
|
|
||||||
#if NET8_0_OR_GREATER
|
|
||||||
DynamicallyAccessedMemberTypes.NonPublicConstructors |
|
|
||||||
DynamicallyAccessedMemberTypes.PublicFields |
|
|
||||||
DynamicallyAccessedMemberTypes.NonPublicFields |
|
|
||||||
DynamicallyAccessedMemberTypes.NonPublicNestedTypes |
|
|
||||||
DynamicallyAccessedMemberTypes.PublicProperties |
|
|
||||||
DynamicallyAccessedMemberTypes.NonPublicProperties |
|
|
||||||
DynamicallyAccessedMemberTypes.PublicConstructors |
|
|
||||||
#endif
|
|
||||||
DynamicallyAccessedMemberTypes.PublicNestedTypes |
|
|
||||||
DynamicallyAccessedMemberTypes.NonPublicMethods |
|
|
||||||
DynamicallyAccessedMemberTypes.PublicMethods
|
|
||||||
)]
|
|
||||||
#endif
|
|
||||||
Type type, MessagePath? path = null)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
using var stream = new MemoryStream(_bytes.ToArray());
|
|
||||||
stream.Position = 0;
|
|
||||||
var result = _model.Deserialize(type, stream);
|
|
||||||
return new CallResult<object>(result);
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
return new CallResult<object>(new DeserializeError("Protobuf deserialization failed: " + ex.Message, ex));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <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
|
|
||||||
public override CallResult<T> Deserialize<
|
|
||||||
[UnconditionalSuppressMessage("AssemblyLoadTrimming", "IL2092:RequiresUnreferencedCode", Justification = "JsonSerializerOptions provided here has TypeInfoResolver set")]
|
|
||||||
[UnconditionalSuppressMessage("AssemblyLoadTrimming", "IL2095:RequiresUnreferencedCode", Justification = "JsonSerializerOptions provided here has TypeInfoResolver set")]
|
|
||||||
[DynamicallyAccessedMembers(
|
|
||||||
#if NET8_0_OR_GREATER
|
|
||||||
DynamicallyAccessedMemberTypes.NonPublicConstructors |
|
|
||||||
DynamicallyAccessedMemberTypes.PublicFields |
|
|
||||||
DynamicallyAccessedMemberTypes.NonPublicFields |
|
|
||||||
DynamicallyAccessedMemberTypes.NonPublicNestedTypes |
|
|
||||||
DynamicallyAccessedMemberTypes.PublicProperties |
|
|
||||||
DynamicallyAccessedMemberTypes.NonPublicProperties |
|
|
||||||
DynamicallyAccessedMemberTypes.PublicConstructors |
|
|
||||||
#endif
|
|
||||||
DynamicallyAccessedMemberTypes.PublicNestedTypes |
|
|
||||||
DynamicallyAccessedMemberTypes.NonPublicMethods |
|
|
||||||
DynamicallyAccessedMemberTypes.PublicMethods
|
|
||||||
)]
|
|
||||||
T>(MessagePath? path = null)
|
|
||||||
#else
|
|
||||||
public override CallResult<T> Deserialize<T>(MessagePath? path = null)
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
var result = _model.Deserialize<T>(_bytes);
|
|
||||||
return new CallResult<T>(result);
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
return new CallResult<T>(new DeserializeError("Protobuf deserialization failed: " + ex.Message, ex));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <inheritdoc />
|
|
||||||
public CallResult Read(ReadOnlyMemory<byte> data)
|
|
||||||
{
|
|
||||||
_bytes = data;
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
_intermediateType = _model.Deserialize<TIntermediate>(data);
|
|
||||||
IsValid = true;
|
|
||||||
return CallResult.SuccessResult;
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
// Not a json message
|
|
||||||
IsValid = false;
|
|
||||||
return new CallResult(new DeserializeError("Protobuf deserialization failed: " + ex.Message, ex));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <inheritdoc />
|
|
||||||
public override string GetOriginalString() =>
|
|
||||||
// NetStandard 2.0 doesn't support GetString from a ReadonlySpan<byte>, so use ToArray there instead
|
|
||||||
#if NETSTANDARD2_0
|
|
||||||
Encoding.UTF8.GetString(_bytes.ToArray());
|
|
||||||
#else
|
|
||||||
Encoding.UTF8.GetString(_bytes.Span);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/// <inheritdoc />
|
|
||||||
public override bool OriginalDataAvailable => true;
|
|
||||||
|
|
||||||
/// <inheritdoc />
|
|
||||||
public override void Clear()
|
|
||||||
{
|
|
||||||
_bytes = null;
|
|
||||||
_intermediateType = default;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,53 +0,0 @@
|
|||||||
using CryptoExchange.Net.Interfaces;
|
|
||||||
using ProtoBuf.Meta;
|
|
||||||
using System.Diagnostics.CodeAnalysis;
|
|
||||||
using System.IO;
|
|
||||||
using System.Reflection;
|
|
||||||
|
|
||||||
namespace CryptoExchange.Net.Converters.Protobuf
|
|
||||||
{
|
|
||||||
/// <inheritdoc />
|
|
||||||
public class ProtobufMessageSerializer : IByteMessageSerializer
|
|
||||||
{
|
|
||||||
private RuntimeTypeModel _model;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// ctor
|
|
||||||
/// </summary>
|
|
||||||
public ProtobufMessageSerializer(RuntimeTypeModel model)
|
|
||||||
{
|
|
||||||
_model = model;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <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
|
|
||||||
public byte[] Serialize<
|
|
||||||
[DynamicallyAccessedMembers(
|
|
||||||
#if NET8_0_OR_GREATER
|
|
||||||
DynamicallyAccessedMemberTypes.NonPublicConstructors |
|
|
||||||
DynamicallyAccessedMemberTypes.PublicFields |
|
|
||||||
DynamicallyAccessedMemberTypes.NonPublicFields |
|
|
||||||
DynamicallyAccessedMemberTypes.NonPublicNestedTypes |
|
|
||||||
DynamicallyAccessedMemberTypes.PublicProperties |
|
|
||||||
DynamicallyAccessedMemberTypes.NonPublicProperties |
|
|
||||||
DynamicallyAccessedMemberTypes.PublicConstructors |
|
|
||||||
#endif
|
|
||||||
DynamicallyAccessedMemberTypes.PublicNestedTypes |
|
|
||||||
DynamicallyAccessedMemberTypes.NonPublicMethods |
|
|
||||||
DynamicallyAccessedMemberTypes.PublicMethods
|
|
||||||
)]
|
|
||||||
T>(T message)
|
|
||||||
#else
|
|
||||||
public byte[] Serialize<T>(T message)
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
using var memoryStream = new MemoryStream();
|
|
||||||
_model.Serialize(memoryStream, message);
|
|
||||||
return memoryStream.ToArray();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,47 +0,0 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
|
||||||
<PropertyGroup>
|
|
||||||
<TargetFrameworks>netstandard2.0;netstandard2.1;net8.0;net9.0;net10.0</TargetFrameworks>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup>
|
|
||||||
<PackageId>CryptoExchange.Net.Protobuf</PackageId>
|
|
||||||
<Authors>JKorf</Authors>
|
|
||||||
<Description>Protobuf support for CryptoExchange.Net</Description>
|
|
||||||
<PackageVersion>10.0.1</PackageVersion>
|
|
||||||
<AssemblyVersion>10.0.1</AssemblyVersion>
|
|
||||||
<FileVersion>10.0.1</FileVersion>
|
|
||||||
<PackageRequireLicenseAcceptance>false</PackageRequireLicenseAcceptance>
|
|
||||||
<PackageTags>CryptoExchange;CryptoExchange.Net</PackageTags>
|
|
||||||
<RepositoryType>git</RepositoryType>
|
|
||||||
<RepositoryUrl>https://github.com/JKorf/CryptoExchange.Net.git</RepositoryUrl>
|
|
||||||
<PackageProjectUrl>https://github.com/JKorf/CryptoExchange.Net/tree/master/CryptoExchange.Net.Protobuf</PackageProjectUrl>
|
|
||||||
<NeutralLanguage>en</NeutralLanguage>
|
|
||||||
<PackageReadmeFile>README.md</PackageReadmeFile>
|
|
||||||
<PackageIcon>icon.png</PackageIcon>
|
|
||||||
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
|
|
||||||
<PackageReleaseNotes>https://github.com/JKorf/CryptoExchange.Net?tab=readme-ov-file#release-notes</PackageReleaseNotes>
|
|
||||||
<Nullable>enable</Nullable>
|
|
||||||
<LangVersion>12.0</LangVersion>
|
|
||||||
<PackageLicenseExpression>MIT</PackageLicenseExpression>
|
|
||||||
</PropertyGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<None Include="..\CryptoExchange.Net\Icon\icon.png" Pack="true" PackagePath="\" />
|
|
||||||
<None Include="README.md" Pack="true" PackagePath="\" />
|
|
||||||
</ItemGroup>
|
|
||||||
<PropertyGroup Label="AOT" Condition="$([MSBuild]::IsTargetFrameworkCompatible('$(TargetFramework)', 'net7.0'))">
|
|
||||||
<IsAotCompatible>true</IsAotCompatible>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup Label="Deterministic Build" Condition="'$(Configuration)' == 'Release'">
|
|
||||||
<PublishRepositoryUrl>true</PublishRepositoryUrl>
|
|
||||||
<IncludeSymbols>true</IncludeSymbols>
|
|
||||||
<SymbolPackageFormat>snupkg</SymbolPackageFormat>
|
|
||||||
<EmbedUntrackedSources>true</EmbedUntrackedSources>
|
|
||||||
<ContinuousIntegrationBuild>true</ContinuousIntegrationBuild>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup>
|
|
||||||
<DocumentationFile>CryptoExchange.Net.Protobuf.xml</DocumentationFile>
|
|
||||||
</PropertyGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<PackageReference Include="CryptoExchange.Net" Version="10.0.2" />
|
|
||||||
<PackageReference Include="protobuf-net" Version="3.2.56" />
|
|
||||||
</ItemGroup>
|
|
||||||
</Project>
|
|
||||||
@@ -1,128 +0,0 @@
|
|||||||
<?xml version="1.0"?>
|
|
||||||
<doc>
|
|
||||||
<assembly>
|
|
||||||
<name>CryptoExchange.Net.Protobuf</name>
|
|
||||||
</assembly>
|
|
||||||
<members>
|
|
||||||
<member name="T:CryptoExchange.Net.Converters.Protobuf.ProtobufMessageAccessor`1">
|
|
||||||
<summary>
|
|
||||||
System.Text.Json message accessor
|
|
||||||
</summary>
|
|
||||||
</member>
|
|
||||||
<member name="F:CryptoExchange.Net.Converters.Protobuf.ProtobufMessageAccessor`1._intermediateType">
|
|
||||||
<summary>
|
|
||||||
The intermediate deserialization object
|
|
||||||
</summary>
|
|
||||||
</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">
|
|
||||||
<inheritdoc />
|
|
||||||
</member>
|
|
||||||
<member name="P:CryptoExchange.Net.Converters.Protobuf.ProtobufMessageAccessor`1.OriginalDataAvailable">
|
|
||||||
<inheritdoc />
|
|
||||||
</member>
|
|
||||||
<member name="P:CryptoExchange.Net.Converters.Protobuf.ProtobufMessageAccessor`1.Underlying">
|
|
||||||
<inheritdoc />
|
|
||||||
</member>
|
|
||||||
<member name="M:CryptoExchange.Net.Converters.Protobuf.ProtobufMessageAccessor`1.#ctor(ProtoBuf.Meta.RuntimeTypeModel)">
|
|
||||||
<summary>
|
|
||||||
ctor
|
|
||||||
</summary>
|
|
||||||
</member>
|
|
||||||
<member name="M:CryptoExchange.Net.Converters.Protobuf.ProtobufMessageAccessor`1.GetNodeType">
|
|
||||||
<inheritdoc />
|
|
||||||
</member>
|
|
||||||
<member name="M:CryptoExchange.Net.Converters.Protobuf.ProtobufMessageAccessor`1.GetNodeType(CryptoExchange.Net.Converters.MessageParsing.MessagePath)">
|
|
||||||
<inheritdoc />
|
|
||||||
</member>
|
|
||||||
<member name="M:CryptoExchange.Net.Converters.Protobuf.ProtobufMessageAccessor`1.GetValue``1(CryptoExchange.Net.Converters.MessageParsing.MessagePath)">
|
|
||||||
<inheritdoc />
|
|
||||||
</member>
|
|
||||||
<member name="M:CryptoExchange.Net.Converters.Protobuf.ProtobufMessageAccessor`1.GetValues``1(CryptoExchange.Net.Converters.MessageParsing.MessagePath)">
|
|
||||||
<inheritdoc />
|
|
||||||
</member>
|
|
||||||
<member name="M:CryptoExchange.Net.Converters.Protobuf.ProtobufMessageAccessor`1.GetOriginalString">
|
|
||||||
<inheritdoc />
|
|
||||||
</member>
|
|
||||||
<member name="M:CryptoExchange.Net.Converters.Protobuf.ProtobufMessageAccessor`1.Clear">
|
|
||||||
<inheritdoc />
|
|
||||||
</member>
|
|
||||||
<member name="M:CryptoExchange.Net.Converters.Protobuf.ProtobufMessageAccessor`1.Deserialize(System.Type,System.Nullable{CryptoExchange.Net.Converters.MessageParsing.MessagePath})">
|
|
||||||
<inheritdoc />
|
|
||||||
</member>
|
|
||||||
<member name="M:CryptoExchange.Net.Converters.Protobuf.ProtobufMessageAccessor`1.Deserialize``1(System.Nullable{CryptoExchange.Net.Converters.MessageParsing.MessagePath})">
|
|
||||||
<inheritdoc />
|
|
||||||
</member>
|
|
||||||
<member name="T:CryptoExchange.Net.Converters.Protobuf.ProtobufStreamMessageAccessor`1">
|
|
||||||
<summary>
|
|
||||||
System.Text.Json stream message accessor
|
|
||||||
</summary>
|
|
||||||
</member>
|
|
||||||
<member name="P:CryptoExchange.Net.Converters.Protobuf.ProtobufStreamMessageAccessor`1.OriginalDataAvailable">
|
|
||||||
<inheritdoc />
|
|
||||||
</member>
|
|
||||||
<member name="M:CryptoExchange.Net.Converters.Protobuf.ProtobufStreamMessageAccessor`1.#ctor(ProtoBuf.Meta.RuntimeTypeModel)">
|
|
||||||
<summary>
|
|
||||||
ctor
|
|
||||||
</summary>
|
|
||||||
</member>
|
|
||||||
<member name="M:CryptoExchange.Net.Converters.Protobuf.ProtobufStreamMessageAccessor`1.Deserialize(System.Type,System.Nullable{CryptoExchange.Net.Converters.MessageParsing.MessagePath})">
|
|
||||||
<inheritdoc />
|
|
||||||
</member>
|
|
||||||
<member name="M:CryptoExchange.Net.Converters.Protobuf.ProtobufStreamMessageAccessor`1.Deserialize``1(System.Nullable{CryptoExchange.Net.Converters.MessageParsing.MessagePath})">
|
|
||||||
<inheritdoc />
|
|
||||||
</member>
|
|
||||||
<member name="M:CryptoExchange.Net.Converters.Protobuf.ProtobufStreamMessageAccessor`1.Read(System.IO.Stream,System.Boolean)">
|
|
||||||
<inheritdoc />
|
|
||||||
</member>
|
|
||||||
<member name="M:CryptoExchange.Net.Converters.Protobuf.ProtobufStreamMessageAccessor`1.GetOriginalString">
|
|
||||||
<inheritdoc />
|
|
||||||
</member>
|
|
||||||
<member name="M:CryptoExchange.Net.Converters.Protobuf.ProtobufStreamMessageAccessor`1.Clear">
|
|
||||||
<inheritdoc />
|
|
||||||
</member>
|
|
||||||
<member name="T:CryptoExchange.Net.Converters.Protobuf.ProtobufByteMessageAccessor`1">
|
|
||||||
<summary>
|
|
||||||
Protobuf byte message accessor
|
|
||||||
</summary>
|
|
||||||
</member>
|
|
||||||
<member name="M:CryptoExchange.Net.Converters.Protobuf.ProtobufByteMessageAccessor`1.#ctor(ProtoBuf.Meta.RuntimeTypeModel)">
|
|
||||||
<summary>
|
|
||||||
ctor
|
|
||||||
</summary>
|
|
||||||
</member>
|
|
||||||
<member name="M:CryptoExchange.Net.Converters.Protobuf.ProtobufByteMessageAccessor`1.Deserialize(System.Type,System.Nullable{CryptoExchange.Net.Converters.MessageParsing.MessagePath})">
|
|
||||||
<inheritdoc />
|
|
||||||
</member>
|
|
||||||
<member name="M:CryptoExchange.Net.Converters.Protobuf.ProtobufByteMessageAccessor`1.Deserialize``1(System.Nullable{CryptoExchange.Net.Converters.MessageParsing.MessagePath})">
|
|
||||||
<inheritdoc />
|
|
||||||
</member>
|
|
||||||
<member name="M:CryptoExchange.Net.Converters.Protobuf.ProtobufByteMessageAccessor`1.Read(System.ReadOnlyMemory{System.Byte})">
|
|
||||||
<inheritdoc />
|
|
||||||
</member>
|
|
||||||
<member name="M:CryptoExchange.Net.Converters.Protobuf.ProtobufByteMessageAccessor`1.GetOriginalString">
|
|
||||||
<inheritdoc />
|
|
||||||
</member>
|
|
||||||
<member name="P:CryptoExchange.Net.Converters.Protobuf.ProtobufByteMessageAccessor`1.OriginalDataAvailable">
|
|
||||||
<inheritdoc />
|
|
||||||
</member>
|
|
||||||
<member name="M:CryptoExchange.Net.Converters.Protobuf.ProtobufByteMessageAccessor`1.Clear">
|
|
||||||
<inheritdoc />
|
|
||||||
</member>
|
|
||||||
<member name="T:CryptoExchange.Net.Converters.Protobuf.ProtobufMessageSerializer">
|
|
||||||
<inheritdoc />
|
|
||||||
</member>
|
|
||||||
<member name="M:CryptoExchange.Net.Converters.Protobuf.ProtobufMessageSerializer.#ctor(ProtoBuf.Meta.RuntimeTypeModel)">
|
|
||||||
<summary>
|
|
||||||
ctor
|
|
||||||
</summary>
|
|
||||||
</member>
|
|
||||||
<member name="M:CryptoExchange.Net.Converters.Protobuf.ProtobufMessageSerializer.Serialize``1(``0)">
|
|
||||||
<inheritdoc />
|
|
||||||
</member>
|
|
||||||
</members>
|
|
||||||
</doc>
|
|
||||||
@@ -1,52 +0,0 @@
|
|||||||
#  CryptoExchange.Net.Proto
|
|
||||||
|
|
||||||
[](https://github.com/JKorf/CryptoExchange.Net/actions/workflows/dotnet.yml) [](https://www.nuget.org/packages/CryptoExchange.Net.Protobuf) 
|
|
||||||
|
|
||||||
Protobuf support for CryptoExchange.Net.
|
|
||||||
|
|
||||||
## Release notes
|
|
||||||
* Version 10.0.1 - 16 Dec 2025
|
|
||||||
* Updated CryptoExchange.Net version to 10.0.0, see https://github.com/JKorf/CryptoExchange.Net/releases/
|
|
||||||
|
|
||||||
* Version 10.0.0 - 16 Dec 2025
|
|
||||||
* Updated CryptoExchange.Net version to 10.0.0, see https://github.com/JKorf/CryptoExchange.Net/releases/
|
|
||||||
|
|
||||||
* Version 9.13.0 - 10 Nov 2025
|
|
||||||
* Updated CryptoExchange.Net version to 9.13.0, see https://github.com/JKorf/CryptoExchange.Net/releases/
|
|
||||||
|
|
||||||
* Version 9.12.0 - 03 Nov 2025
|
|
||||||
* Updated CryptoExchange.Net version to 9.12.0, see https://github.com/JKorf/CryptoExchange.Net/releases/
|
|
||||||
|
|
||||||
* Version 9.11.1 - 30 Oct 2025
|
|
||||||
* Updated CryptoExchange.Net version to 9.11.0, see https://github.com/JKorf/CryptoExchange.Net/releases/
|
|
||||||
|
|
||||||
* Version 9.11.0 - 30 Oct 2025
|
|
||||||
* Updated CryptoExchange.Net version to 9.11.0, see https://github.com/JKorf/CryptoExchange.Net/releases/
|
|
||||||
|
|
||||||
* Version 9.10.0 - 15 Oct 2025
|
|
||||||
* Updated CryptoExchange.Net version to 9.10.0, see https://github.com/JKorf/CryptoExchange.Net/releases/
|
|
||||||
|
|
||||||
* Version 9.9.0 - 06 Oct 2025
|
|
||||||
* Updated CryptoExchange.Net version to 9.9.0, see https://github.com/JKorf/CryptoExchange.Net/releases/
|
|
||||||
|
|
||||||
* Version 9.8.0 - 30 Sep 2025
|
|
||||||
* Updated CryptoExchange.Net version to 9.8.0, see https://github.com/JKorf/CryptoExchange.Net/releases/
|
|
||||||
|
|
||||||
* Version 9.7.0 - 01 Sep 2025
|
|
||||||
* Updated CryptoExchange.Net version to 9.7.0, see https://github.com/JKorf/CryptoExchange.Net/releases/
|
|
||||||
|
|
||||||
* Version 9.6.0 - 25 Aug 2025
|
|
||||||
* Updated CryptoExchange.Net version to 9.6.0
|
|
||||||
|
|
||||||
* Version 9.5.0 - 19 Aug 2025
|
|
||||||
* Updated CryptoExchange.Net version to 9.5.0
|
|
||||||
|
|
||||||
* Version 9.4.0 - 04 Aug 2025
|
|
||||||
* Updated CryptoExchange.Net to version 9.4.0, see https://github.com/JKorf/CryptoExchange.Net/releases/
|
|
||||||
* Updated protobuf-net package version to 3.2.56
|
|
||||||
|
|
||||||
* Version 9.3.0 - 23 Jul 2025
|
|
||||||
* Updated CryptoExchange.Net to version 9.3.0, see https://github.com/JKorf/CryptoExchange.Net/releases/
|
|
||||||
|
|
||||||
* Version 9.2.0 - 14 Jul 2025
|
|
||||||
* Initial release
|
|
||||||
Reference in New Issue
Block a user