【发布时间】:2021-02-11 07:18:15
【问题描述】:
背景资料
我有一个 .Net Standard 2.0 类库,它使用 Protobuf-net.grpc 的代码优先方法来定义 gRPC 服务。在这个定义中,我有定义不同数据结构的类,我们使用这些数据结构来记录传感器数据并使用 protobuf-net 将其序列化。我的程序正在摄取数十万个大对象/秒(很快将扩展到数百万个),旨在用于嵌入式环境。
问题
在下面的课程中,我想将 System.Numerics.Quaterion 作为成员包括在内。我似乎无法将其序列化。使用静态构造函数时,RuntimeTypeModel 会抛出异常,因为在执行静态构造函数时已经以某种方式创建了四元数模型。由于这是一个类库,我非常希望避免在每个使用 gRPC 服务的不同程序中调用 RuntimeTypeModel。我希望找到一种方法来序列化 System.Numerics.Quaternion。
我尝试将此静态构造函数运行时定义放在类层次结构的最高级别,但无济于事。仍然抛出异常。
[ProtoContract]
public class IMUData : SensorData, ISensorData
{
static IMUData()
{
RuntimeTypeModel.Default.Add(typeof(Quaternion), false)
.Add("W")
.Add("X")
.Add("Y")
.Add("Z");
}
... //Other members
[ProtoMember(8)]
public Quaternion Orientation
{
get; set;
}
... //Other methods and members
}
问题
我想做的事情是否可能,或者我应该简单地创建自己的四元数类并定义隐式运算符? (我宁愿避免这种情况,因为处理数十亿个这样的对象需要足够长的时间)
【问题讨论】:
-
顺便说一句:IMO,这里的正确顺序是
X、Y、Z、W- 由Quaternion(float x, float y, float z, float w)构造函数定义 - 所以如果这是我, 我会订购它们 X=1,Y=2,Z=3,W=4;我之所以这么说是因为这种类型实际上非常接近库会自动识别和使用的内置“类元组类型”模式 - 如果一个类型(没有合适的注释)有一个构造函数匹配所有成员(除了参数名称上的大小写),它会推断它的意思是“构造函数参数顺序定义了字段编号”
标签: c# .net-core protobuf-net .net-standard