我试图在C#中使用protobuf-net和位置记录类型,但是遇到了以下异常:
10:18:48.048 [EROR] #010 (Microsoft.AspNetCore.Server.Kestrel) Connection id ""0HM4NDHMUB3C6"", Request id ""0HM4NDHMUB3C6:00000003"": An unhandled exception was thrown by the application.
Grpc.Core.RpcException: Status(StatusCode="Internal", Detail="Error starting gRPC call. ProtoException: No parameterless constructor found for Bidirectional.Demo.Common.Contracts.Server.GetServerProcessI
nfo.GetServerProcessInfoResponse", DebugException="ProtoBuf.ProtoException: No parameterless constructor found for Bidirectional.Demo.Common.Contracts.Server.GetServerProcessInfo.GetServerProcessInfoResp
onse
at ProtoBuf.Internal.ThrowHelper.ThrowProtoException(String message, Exception inner) in /_/src/protobuf-net.Core/Internal/ThrowHelper.cs:line 70
at ProtoBuf.Meta.TypeModel.ThrowCannotCreateInstance(Type type, Exception inner) in /_/src/protobuf-net.Core/Meta/TypeModel.cs:line 1666
at proto_12(State& , GetServerProcessInfoResponse )
at ProtoBuf.Internal.Serializers.SimpleCompiledSerializer`1.ProtoBuf.Serializers.ISerializer<T>.Read(State& state, T value)
at ProtoBuf.ProtoReader.State.ReadAsRoot[T](T value, ISerializer`1 serializer)
at ProtoBuf.ProtoReader.State.DeserializeRoot[T](T value, ISerializer`1 serializer)
at ProtoBuf.Meta.TypeModel.Deserialize[T](ReadOnlySequence`1 source, T value, Object userState)
at ProtoBuf.Grpc.Configuration.ProtoBufMarshallerFactory.ContextualDeserialize[T](DeserializationContext context)
这是 GetServerProcessInfoResponse 的样式:
[ProtoContract]
public record GetServerProcessInfoResponse(
[property: ProtoMember(1)] TimeSpan TotalProcessorTime,
[property: ProtoMember(2)] TimeSpan UserProcessorTime,
[property: ProtoMember(3)] TimeSpan PrivilegedProcessorTime,
[property: ProtoMember(4)] string CurrentMemoryUsage,
[property: ProtoMember(5)] string PeakMemoryUsage,
[property: ProtoMember(6)] int ActiveThreads
);
如果我将GetServerProcessInfoResponse更改为具有可获取和可设置属性的常规C#类,则代码可以正常工作。然而,我希望记录也可以工作,因为它们避免了大量的空值警告。例如,System.Text.Json支持反序列化记录,这必须针对相同的限制进行工作。
我在文档、问题或StackOverflow上找不到任何东西,所以也许我擅长搜索,或者答案还没有出现。:-) protobuf-net存储库似乎也没有任何单元测试尝试序列化/反序列化C#记录,它只包含"RecordTypeTests",这似乎是检查记录是否可以克隆?
StackExchange.StackOverflow.ValuedAssociates.MarcGravell.Summon();
。 - Lasse V. Karlsen