为什么我必须使用[ProtoIninclude]?

2023-11-21

我读过很多关于 protobuf-net 继承功能的问题。 我只是想知道是否可以像使用 [ProtoContract],[ProtoMember] 一样使用 [DataContract],[DataMember]。为什么我不能使用 [KnowType] 而不是使用 [ProtoInclude]?

我提出这个问题是因为我已经使用 [DataContract],[DataMember] 进行 protobuf-net 的序列化。无需添加“Protobuf-net”。它仅使用“System.Runtime.Serialization”。

但是...现在如果我的类需要从某个类继承,我是否必须为 [ProtoInclude] 属性添加“Protobuf-net”?例如,

using System.Runtime.Serialization;
namespace test
{

[DataContract]
/// [KnowType(typeof(SomeClass))]
/// or
/// [ProtoInclude(100,typeof(SomeClass))]
public class BaseClass
{
   //...
   [DataMember(Order=1)]
   public string BlahBlahBlah {get; set;}
}

[DataContract]
public class ChildClass1 : BaseClass
{
   //...
   [DataMember(Order=1)]
   public string BlahBlahBlah {get; set;}
}
}// end namespace

最后,我想知道如果我有 100 个子类,我会不会让自己发疯,在基类中添加 100 个 [ProtoInclude] 标签?

提前感谢您的帮助

vee


编辑:这在 v2 中不再需要 - 您可以在运行时指定它,或者使用DynamicType.


原因是 protobuf 传输格式(由 Google 设计)不包含任何类型元数据,因此我们需要some了解我们正在谈论的对象类型的方法。[KnownType]不提供此信息,并且没有明确的方法来独立提供可靠的密钥。

其实protobuf不支持继承either- protobuf-net 通过将子类型视为嵌套消息来解决这个问题。所以一个ChildClass1实际上出现在途中好像BlahBlahBlah是子对象的属性,有点像:

message BaseClass {
    optional ChildClass1 ChildClass1 = 1;
    optional SomeOtherSubType SomeOtherSubType = 2;
}
message ChildClass1 {
    optional string BlahBlahBlah = 1;
}

etc

重新省略;在“v2”中,您可以选择通过自己的代码在类型模型之外指定此数据。这意味着您不需要装饰所有内容,但仍然需要某种机制将键与类型相关联。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么我必须使用[ProtoIninclude]? 的相关文章

随机推荐

  • 为什么我在运行 Docker Desktop 时收到“0/1 个节点可用”?

    我正在使用 Kubernetes 运行 Docker Desktop 我可以通过 ssh 连接到该节点 并且该节点上正在运行其他 pod 但是 当我将 StatefulSet 应用于集群时 我得到 0 1 nodes are availab
  • 在 VS Designer 上使用 Form(Of T)

    我正在使用 vb net vs2010 我正在将一些 winform 移动到 dll 中 我有一种继承自具有一些子项和功能 如测试应用程序 的表单 我的原始形式是 designer Partial Class Form1 Of T Inhe
  • C 中的逻辑相等

    这似乎很奇怪 它不存在 所以如果它是重复的 请提前道歉 我想测试 C 中的逻辑相等性 换句话说 我想知道如果两个值都以与逻辑表达式相关的正常方式转换 它们是否相等 在C99中 我认为 bool a bool b 给出我想要的 那是对的吗 用
  • 在 Flutter 中结合 SingleChildScrollView 和 PageView

    我创建了两个表单 并将它们添加到 PageView 中 每个表单有 6 个 TextFormField 当我点击最后 2 个 TextFormField 时 键盘会显示在这些字段上方并隐藏它们 我需要的是 当我点击每个字段并且键盘可见时 向
  • 如何使用Python requests 库发出post 请求?

    我在 Postman 中使用以下过滤器在 Web API 中发出 POST 请求 但无法使用 requests 库在 Python 中发出简单的 POST 请求 First 我正在向此 URL 发送 POST 请求 http 10 61 2
  • Python - Zelle书使用eval(),是错误的吗?

    请注意 这不是关于 eval 的使用 而是关于使用和教授它的书籍的潜在质量 或缺乏质量 因此 Python 中已经有无数关于 eval 的线程 冒着招致SO的愤怒和反对票的风险 我还是决定问这个问题 以防万一 请多多包涵 我已经尝试过谷歌和
  • 使用 SOAP Web 服务时出现“未找到操作标头”错误消息

    在 iOS 应用程序中使用 SOAP Web 服务时出现以下错误 No Action header was found with namespace http www w3 org 2005 08 addressing for the gi
  • 在架构中的子文档数组上指定 select : false

    我正在寻求有关关闭子文档数组属性选择的正确语法的帮助 我希望得到这样的东西 var UserSchema new Schema fb id Number children type CustomChildSchema select fals
  • 重新定义 C++ 关键字合法吗?

    In 本文本周的大师说道 It is illegal to define a reserved word 这是真的 我在规范中找不到任何东西 例如 我已经看到程序员重新定义了新的东西 17 4 3 1 1 宏名称 lib macro nam
  • 使用 Google Maps JavaScript API 绘制轮廓和阴影区域

    Google 地图网络应用程序以非常漂亮的方式对区域进行地理编码和勾画 这可以通过 Google Maps JavaScript API 实现吗 网站示例 这是瑞典斯科讷省 谷歌地图网络应用程序用红色勾勒出它的轮廓 并把它涂成粉红色 我想使
  • 在Python中查找包含所需字符串的目录中的文件

    我试图在目录中包含的文件中查找字符串 我有一个像这样的字符串banana我知道它存在于一些文件中 import os import sys user input input What is the name of you directory
  • JSF 同时 ajax 调用

    JSF 是否可以进行同时执行的 ajax 调用 无需等待先前的调用完成后再开始新的调用 不 它们按照规范显式排队 没有任何例外 参见第 13 3 2 章JSF 2 规范 13 3 2 Ajax 请求排队 所有 Ajax 请求在发送到客户端之
  • 动态添加/删除输入时清除输入值[重复]

    这个问题在这里已经有答案了 我有输入元素 单击按钮时可以清除值 此输入还可以动态添加或删除输入元素 但我坚持添加输入元素后 清除按钮不起作用 这是我到目前为止尝试过的 ADD Remove input var counter 1 custo
  • MVC 5 访问声明身份用户数据

    我正在开发一个MVC 5网络应用程序使用实体框架 5 数据库优先方法 我在用OWIN用于用户的身份验证 下面显示了我的帐户控制器中的登录方法 public ActionResult Login LoginViewModel model st
  • Angular 包是如何构建的

    Angular 构建生成了哪些不同的文件 我注意到其中有 6 个 main js polyfill js runtime js scripts js vendor js styles js 我想 Angular 使用webpack进行构建
  • invokeAll() 是 java 7 中的阻塞调用

    ExecutorService executorService Executors newSingleThreadExecutor Set
  • HTML5 FormData 在 Java Servlet request.getParameter() 中返回 null

    我的观点是 HTML 5 我正在使用 FormData 向 Servlet 发送 AJAX 2 POST 在 servlet 内部 我试图读取请求参数 我看不到任何参数 但是 Google Chrome 开发控制台会显示请求负载 如何在 S
  • 导入在 Colab 中与您共享/由您共享的 Google 云端硬盘文件

    相当明显的是 这simplest推荐的方式还提供了最简单的 API 用于从驱动器文件夹中读取文件 from google colab import drive drive mount content gdrive 不允许访问 Google
  • 引用可能比指针更有效吗?

    我想知道有时 取决于平台或编译器或代码中的上下文等 引用是否比指针更有效 引用可能比指针更有效吗 不 不必要 标准也没有这么说 大多数编译器通过使用指针来实现引用机制 添加了对 C 的引用以支持运算符重载而不是为了效率
  • 为什么我必须使用[ProtoIninclude]?

    我读过很多关于 protobuf net 继承功能的问题 我只是想知道是否可以像使用 ProtoContract ProtoMember 一样使用 DataContract DataMember 为什么我不能使用 KnowType 而不是使