当前位置: 首页 > 知识库问答 >
问题:

更新protobuf net后,“NotSupportedException:类型不能表示为默认值”

贺君浩
2023-03-14

更新到最新版本的原型网(2.4.0)后,事情不再工作了:

系统InvalidOperationException:无法为:QueryContainer准备序列化程序

多年来,在2.0.0.668版本中,一切都运行良好,似乎在2.2.1版本中也能正常工作,但2.3.0版本和更新版本导致了这个问题。

什么改变了,或者说我从来没有做对过什么?:-)我构建了一个小型复制程序,其结果是:

无法为ProtoRepro准备序列化程序。程序QueryContainer InnerException:类型不能表示为默认值:System。收藏。通用的KeyValuePair`2[[ProtoRepro.Program Query,ProtoRepro,Version=1.0.0,Culture=neutral,PublicKeyToken=null],[System.Double,System.Private.CoreLib,Version=4.0.0.0,Culture=neutral,PublicKeyToken=7cec85d7bea7798e]]

using ProtoBuf;
using ProtoBuf.Meta;
using System;
using System.Collections.Generic;
using System.Runtime.Serialization;

namespace ProtoRepro {

  internal class Program {
    private static void Main(string[] args) {
      try {
        RuntimeTypeModel.Default[typeof(QueryContainer)].CompileInPlace();
        // we get here with version 2.2.1 and lower
        Console.WriteLine("Everything is fine!");
      } catch (InvalidOperationException ioex) {
        Console.Write(ioex.ToString());
      } catch (NotSupportedException nsex) {
        Console.Write(nsex.ToString());
      }
    }

    [Serializable, ProtoContract]
    public class QueryContainer {
      private QueryContainer() { }
      [ProtoMember(1, OverwriteList = true)]
      public Dictionary<string, KeyValuePair<Query, double>> QueryAndWeightPerVariable { get; protected set; }
    }

    [Serializable, ProtoContract]
    public class Query {
      [ProtoMember(1)]
      public QueryValue QueryValue { get; set; }
      protected Query() { }
      public Query(QueryValue queryValue) {
        QueryValue = queryValue;
      }
    }

    [Serializable, ProtoContract]
    public class QueryValue {
      [ProtoMember(1)]
      public object Value { get; set; }
      protected QueryValue() { }
      public QueryValue(object value) {
        Value = value;
      }
    }
  }
}

共有1个答案

左丘阳晖
2023-03-14

我将不得不设置一个本地测试来弄清它的底细,但是这里的变化很可能与“映射”行为有关。因此,您可以尝试添加

[ProtoMap(DisableMap = true)]

给字典的成员。如果这是一个猜测,我道歉(特别是如果我错了!),但我必须等到我有时间再深入研究。将其作为问题记录在GitHub上可能也很有用。

 类似资料:
  • 我是MySQL的博士后新手。 我创建了一个表,其列“col”的默认值为null。 但是,在默认列中,没有任何内容表明它是空字段。 在模式输出中,默认值应该显示为null吗? 我也尝试了上面的相同示例,但使用了。键入时,Default列中没有显示任何内容。在该示例中,我插入一行,它获取默认值,因此我知道正在使用默认值(至少对于整数值)。更新:默认列实际上显示了99。我使用了自动完成\d并查看了错误的

  • 列插入和更新默认值是指创建 默认值 对于一行中的特定列,INSERT或UPDATE语句正在对该行执行,如果 没有为该列的INSERT或UPDATE语句提供值 . 也就是说,如果一个表有一个名为“timestamp”的列,并且INSERT语句继续执行,但不包括该列的值,则INSERT default将创建一个新值,例如current time,用作要插入“timestamp”列中的值。如果声明 do

  • Visual Studio代码中是否有方法更改用于新文件的默认语言? 默认情况下,如果您打开一个新文件,它将设置为“纯文本”,我希望它改为“HTML”。 我经常将HTML复制粘贴到VSC中,进行一些编辑,然后将其复制回我正在使用的CMS(CMS编辑器很糟糕)。我根本不想将代码保存在我的计算机上,只需使用 HTML 语法突出显示对其进行一些编辑,但我希望这是默认设置。

  • 问题内容: 我正在尝试编写一些搜索输入,以使用ngResource从数据库中获取数据。 数据在页面上显示为ng-repeat,但是当我执行搜索并且$ scope已更新时,该视图未更新并显示旧数据。 这是代码: main.html(活动视图) main.js searchbar.js 当它启动时,它从数据库中获取所有数据并正确显示它们,当我尝试进行搜索时,$ scope.eventi会更新(我可以从

  • 我有一个包含2900万行的大型PostgreSQL表。该表的大小(根据pgAdmin中的stats选项卡,几乎为9GB)为post-gis启用了一个空的geometry列。 我想使用ST_GeomFromText更新几何体列,从存储在同一表中的X和Y坐标列(SRID:27700)读取数据。但是,一次对整个表运行此查询会导致“磁盘空间不足”和“服务器连接丢失”错误……后者的频率较低。 为了克服这个问

  • 问题内容: 根据我的理解和JPA批注进行提取。我希望将它们延迟加载到我的应用程序中,或者至少提示它(这是hibernate默认值)。我已经开始添加注释 例如 代替 这既乏味又容易出错。有什么方法可以在应用程序级别执行此操作吗?在persistence.xml中? 问题答案: 迄今为止,我选择让Hibernate在通过注释进行映射方面遵循JPA规范,仅仅是因为我没有收到任何使其可配置的功能请求,这令