gpt4 book ai didi

c# - 在 protobuf-net 中继承序列化

转载 作者:行者123 更新时间:2023-11-30 17:09:42 24 4
gpt4 key购买 nike

给定一个看起来像这样的 .proto:

message Base {
string Dummy = 1
}

message Derived {
Base Super = 1
string Parp = 2
}

...还有一些 C# 之类的东西:

public class Base {
public string Dummy;
}

public class Derived : Base {
public string Parp
}

如何在 protobuf-net 中自定义序列化才能做到这一点?最初我开始考虑使用 TypeModel 并为 Base MetaType 调用 AddSubType,但后来它似乎为 Base 创建了类型定义,其中包含所有派生类的可选字段(即与我需要的相反)

我以为我可以自己遍历层次结构,但查看 TypeModel,它似乎支持将类型提供给 Deserialise,但它在序列化期间使用 value.GetType()。即便如此,我还不完全清楚我将如何做到这一点。我唯一的选择是使用 ProtoWriter 手写每个字段吗?这是我目前正在尝试的,但我希望有更简单的方法。

最佳答案

首先要注意的是protobuf本身是不支持继承的。对此没有“官方”布局。 Protobuf-net 不会按照您希望的方式支持序列化:选择子类型封装(而不是基类型封装)是为了解决几个问题,包括:

  • 满足里氏替换原则
  • 在调用者不知道/不期望序列化类型时正常工作
  • 基本上,完全可以工作(除了最简单的例子之外的任何事情,在最简单的例子中,两端都事先确切地知道他们得到的是哪种子类型,这在很大程度上破坏了多态性的意义)

但是,您可以手动映射 DTO,基本上这样您的 DTO 层就根本不使用继承。

关于c# - 在 protobuf-net 中继承序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12674085/

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