无法在protobuf-net中使用struct

问题描述 投票:0回答:1
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' 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
1[TResponse] ServerStreamingAsync[TRequest,TResponse](ProtoBuf.Grpc.CallContext ByRef,Grpc.Core.CallInvoker,Grpc.Core.Method`2[TRequest,TResponse], TRequest, System.String)' 违反了类型 'TResponse' 的约束。

我正在尝试创建类似的包装器

[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);
}
c# .net protocol-buffers protobuf-net
1个回答
0
投票

这来自于基础 gRPC 位中令人讨厌的

: class
约束 ;我曾多次尝试放松此约束(我什至至少进行了一次影响分析和代码更改),但是;还没有喜悦。 Protobuf-net 理论上可以添加一个假盒子层来解决它,但是:到目前为止,我根本没有时间来实现我想要的一切。这样的问题对于帮助我确定优先顺序非常有帮助。 对于第二个:我不太确定你想用 ROM 字节做什么 - 如果这是为了“双关语”,那么也许我们可以在库内为你更有效地做一些事情,但是:双关并不完全是 100% 纯 protobuf,并且不会具有相同的正确性保证(尤其是 CPU 架构之间的字节序)。但是,IIRC 它应该工作

- 检查您是否使用正确的 V3 版本的 protobuf-net(它在 V2 中不起作用)。

© www.soinside.com 2019 - 2024. All rights reserved.