public struct Candle //88 bytes struct
{
[DataMember(Order = 1)] public long TimeStamp { get; }
[DataMember(Order = 2)] public decimal Open { get; }
[DataMember(Order = 3)] public decimal High { get; }
[DataMember(Order = 4)] public decimal Low { get; }
[DataMember(Order = 5)] public decimal Close { get; }
[DataMember(Order = 6)] public decimal Volume { get; }
}
我有这样的模型,我可以通过形式传递给你
Task<IEnumerable<Candle>>
但是我不能把它当作
IAsyncEnumerable<Candle>
但是一旦我将结构更改为类,一切就开始工作,但由于分配,我无法使用它
System.TypeInitializationException :类型初始值设定项 '默认代理缓存
1[TResponse] ServerStreamingAsync[TRequest,TResponse](ProtoBuf.Grpc.CallContext ByRef,Grpc.Core.CallInvoker,Grpc.Core.Method`2[TRequest,TResponse], TRequest, System.String)' 违反了类型 'TResponse' 的约束。1' threw an exception. ----> System.InvalidOperationException : Error obtaining client-helper 'ServerStreamingAsync' (from: 'IODataModule.Shared.GetRangeArgument', to: 'Domain.Candle'): GenericArguments[1], 'Domain.Candle', on 'System.Collections.Generic.IAsyncEnumerable
我正在尝试创建类似的包装器
[DataContract]
public class CandleDto
{
[DataMember(Order = 1)]
public ReadOnlyMemory<Candle> CandleBatch { get; set; }
}
并通过 IAsyncEnumerable 发送
但是它抛出了
System.TypeInitializationException :类型初始值设定项 “DefaultProxyCache`1”引发异常。 ----> System.Reflection.TargetInitationException:异常已 由调用的目标抛出。 ----> System.InvalidOperationException:没有可用的编组器 IODataModule.Shared.CandleDto
但它适用于
[DataContract]
public class CandleDto
{
[DataMember(Order = 1)]
public ReadOnlyMemory<byte> CandleBatch { get; set; }
}
这是我的合同
[ServiceContract]
public interface ICandleAccessServiceGrpc
{
[OperationContract]
IAsyncEnumerable<CandleDto> GetRangeStream(GetRangeArgument argument, CallContext context = default);
}
这来自于基础 gRPC 位中令人讨厌的
: class
约束 ;我曾多次尝试放松此约束(我什至至少进行了一次影响分析和代码更改),但是;还没有喜悦。 Protobuf-net 理论上可以添加一个假盒子层来解决它,但是:到目前为止,我根本没有时间来实现我想要的一切。这样的问题对于帮助我确定优先顺序非常有帮助。
对于第二个:我不太确定你想用 ROM 字节做什么 - 如果这是为了“双关语”,那么也许我们可以在库内为你更有效地做一些事情,但是:双关并不完全是 100% 纯 protobuf,并且不会具有相同的正确性保证(尤其是 CPU 架构之间的字节序)。但是,IIRC 它应该工作 - 检查您是否使用正确的 V3 版本的 protobuf-net(它在 V2 中不起作用)。