首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >(反序列化特定子类而不使用[ProtoInclude] )

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

Stack Overflow用户
提问于 2019-08-03 20:16:26
回答 1查看 281关注 0票数 3

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

简化的类层次结构:

代码语言:javascript
复制
[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; }
}

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

代码语言:javascript
复制
[ServiceContract]
public interface IPersonService 
{
    [OperationContract]
    ScalarResult<PersonDto> GetById(personId);
}

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

那么问题是如何对protobuf做同样的事情呢?如果不可能,为什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-08-03 20:41:52

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

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

我现有的模型在我选择的序列化程序中不能很好地工作。

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

如果您的现有模型并不适合不同的序列化程序,请停止对抗序列化程序。相反,创建一个与您新选择的序列化程序完美地工作的新模型,并在(反)序列化点在模型之间切换。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57341796

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档