gpt4 book ai didi

c# - (反)序列化特定子类而不使用 [ProtoInclude]

转载 作者:太空宇宙 更新时间:2023-11-03 12:00:20 29 4
gpt4 key购买 nike

我正在考虑将当前基于 WCF 的应用程序迁移到 protobuf-net.Grpc。这似乎是可行的,但是我无法在不包含所有具有 [ProtoInclude] 属性的派生类的情况下使(DTO 类)基类的 protobuf-net 序列化属性。

简化的类层次结构:

[DataContract]
public abstract class DtoBase
{
[DataMember(Order = 1)]
public int Id { get;set; }
[DataMember(Order = 2)]
public int Version { get;set; }
[DataMember(Order = 3)]
public EditState EditState { get;set; }
}

[DataContract]
public class PersonDto : DtoBase
{
[DataMember(Order=4)]
public string FirstName { get;set; }
[DataMember(Order=5)]
public string LastName { get;set; }
}

我调查了相关问题,归结为在反序列化过程中应该知道特定类型的事实——或者应该有一种方法来确定它。我们的服务方法已经知道要使用的特定子类,例如我们有这样的方法

[ServiceContract]
public interface IPersonService
{
[OperationContract]
ScalarResult<PersonDto> GetById(personId);
}

DataContractSerializer 可以做到这一点 - 当特定子类已知时反序列化基类属性。当您反序列化具有基类签名的子类时,它需要提示(已知类型),例如返回 PersonDto 而不是 DtoBase。但是当特定的子类已知时,就不需要已知的类型了,一切都可以正常工作。

所以问题是如何对 protobuf-net 做同样的事情?如果不可能,为什么?

最佳答案

Protobuf-net 与任何库一样,会做出某些假设和妥协。如果它想支持额外的场景,它们需要被指定、设计、实现、测试和支持——所有这些都需要时间。到目前为止,您描述的场景:还没有投入那么多时间。

可以使用 RuntimeTypeModel API 配置基本类型属性,但我必须强调:每当出现问题时,本质上是:

My existing model isn't working well with my chosen serializer

我的默认回答(基于该领域几十年的经验)是:

If your existing model isn't a great fit for a different serializer: stop fighting the serializer. Instead, create a new model that works perfectly with your new choice of serializer, and shim between models at the point of (de)serialization

关于c# - (反)序列化特定子类而不使用 [ProtoInclude],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57341796/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com