我正在考虑将当前基于WCF的应用程序迁移到protobuf-net.Grpc。这似乎是可行的,但是,如果不包含具有ProtoInclude属性的所有派生类,则无法使(DTO类)基类的protobuf序列化属性。
简化的类层次结构:
[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做同样的事情呢?如果不可能,为什么?
发布于 2019-08-03 20:41:52
与任何图书馆一样,Protobuf也做出了某些假设和妥协。如果它想支持其他场景,则需要指定、设计、实现、测试和支持它们--所有这些都需要时间。到目前为止,您描述的场景:还没有投入那么多时间。
使用RuntimeTypeModel API配置基本类型属性可能是可能的,但我必须强调:每当出现问题时,本质上是:
我现有的模型在我选择的序列化程序中不能很好地工作。
我的默认响应(基于该领域几十年的经验)是:
如果您的现有模型并不适合不同的序列化程序,请停止对抗序列化程序。相反,创建一个与您新选择的序列化程序完美地工作的新模型,并在(反)序列化点在模型之间切换。
https://stackoverflow.com/questions/57341796
复制相似问题