使用 protobuf-net 序列化 [Flags] 枚举时出现 InvalidOperationException

2024-01-10

我正在尝试序列化enum装饰有的类型[Flags]属性。这enum声明如下:

[Flags]
[ProtoContract(EnumPassthru = true)]
public enum Categories
{
    [ProtoEnum(Name = nameof(Invalid), Value = 0x0)]
    Invalid = 0x0,

    [ProtoEnum(Name = nameof(A), Value = 0x1)]
    A = 0x1,
    [ProtoEnum(Name = nameof(B), Value = 0x2)]
    B = 0x2,
    [ProtoEnum(Name = nameof(C), Value = 0x4)]
    C = 0x4,
    [ProtoEnum(Name = nameof(D), Value = 0x8)]
    D = 0x8,
    [ProtoEnum(Name = nameof(Global), Value = 0x1 | 0x2 | 0x4 | 0x8)]
    Global = A | B | C | D,
}

现在,当我尝试序列化容器对象时,我得到

InvalidOperationException:由于对象的当前状态,操作无效。

继 SO 上的其他类似帖子之后,我尝试了以下操作:

  1. Add EnumPassthru = true我的枚举 ProtoContract 属性中的参数
  2. Use RuntimeTypeModel.Default[typeof(Categories)].EnumPassthru = true;在应用程序启动阶段,
  3. 使用 IsRequired 参数提供容器对象的枚举值字段[ProtoMember(6, IsRequired = true)]

我的枚举声明还有什么遗漏的吗?

异常详细信息的开头如下所示:

InvalidOperationException:由于对象的当前状态,操作无效。\r\n 位于 c:\Users\onur.gumus\Desktop\protobuf-net-master\protobuf 中的 ProtoBuf.Serializers.EnumSerializer.EnumToWire(Object value) -net\Serializers\EnumSerializer.cs:line 83\r\n at ProtoBuf.Serializers.EnumSerializer.Write(Object value, ProtoWriter dest) in c:\Users\onur.gumus\Desktop\protobuf-net-master\protobuf- net\Serializers\EnumSerializer.cs:第 125 行\r\n 位于 c:\Users\onur.gumus\Desktop\protobuf-net-master\protobuf-net 中的 ProtoBuf.Serializers.FieldDecorator.Write(Object value, ProtoWriter dest) \Serializers\FieldDecorator.cs:第 38 行\r\n 位于 c:\Users\onur.gumus\Desktop\protobuf-net-master\protobuf-net\ 中的 ProtoBuf.Serializers.TypeSerializer.Write(Object value, ProtoWriter dest) Serializers\TypeSerializer.cs:第 173 行\r\n 位于 c:\Users\onur.gumus\Desktop 中的 ProtoBuf.Meta.TypeModel.TrySerializeAuxiliaryType(ProtoWriter writer、类型类型、DataFormat 格式、Int32 标记、对象值、布尔值 isInsideList) \protobuf-net-master\protobuf-net\Meta\TypeModel.cs:第 125 行 ...


在所有容易获得的(即不是古老的)版本的 protobuf-net 中,[Flags]将激活传递行为,使其正常工作。[ProtoContract(EnumPassThru = true)] will also激活直通行为,但如果[Flags]已指定。

在 2.3.0 及更高版本中,直通行为也是默认假设只要你没有[ProtoEnum]属性实际上改变序列化值(其中:你的没有) - 这是为了与“proto3”更加一致,并且使得在绝大多数情况下更容易使用枚举。

所以:没有必要这样做anything在这里 - 你的代码应该已经可以工作了。

我已经尝试过你的代码:

  • 2.3.0 和 2.0.0.668
  • 具有问题中的属性,以及除[Flags] removed
  • 在 2.3.0 上甚至[Flags]属性已删除(尽管我同意在您的情况下应该保留它 - 这绝对是一个[Flags] enum)
  • 以枚举作为根值,并以枚举作为标记的成员[ProtoMember]在传入的对象上

在所有情况下它都工作得很好。所以:在一般情况下,我只能说,你所拥有的应该已经可以工作了.

如果它失败了specific在这种情况下,最好在问题中包含完整的可运行示例(理想情况下准确地告诉我们您正在运行的框架),以便我们可以看到您所看到的内容。这工作得很好,例如:

using ProtoBuf;
using System;

[Flags]
public enum Categories
{
    Invalid = 0x0,
    A = 0x1,
    B = 0x2,
    C = 0x4,
    D = 0x8,
    Global = A | B | C | D,
}
[ProtoContract]
public class X
{
    [ProtoMember(1)]
    public Categories Val { get; set; }
    public override string ToString() => Val.ToString();
}
static class P
{
    static void Main()
    {
        var orig = new X { Val = Categories.D | Categories.B };
        var cloneObj = Serializer.DeepClone(orig);
        Console.WriteLine(cloneObj);

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

使用 protobuf-net 序列化 [Flags] 枚举时出现 InvalidOperationException 的相关文章

  • 除了第一列之外,Gridview 行可点击?

    我使用以下代码使 gridview 的整行可单击 protected void gridMSDS RowDataBound object sender GridViewRowEventArgs e if e Row RowType Data
  • System.MissingMethodException:找不到方法?

    以前工作的 ASP NET WebForms 应用程序现在抛出此错误 System MissingMethodException 找不到方法 The DoThis方法位于同一个类上 它应该可以工作 我有一个这样的通用处理程序 public
  • 根据另一个列表的内容对列表进行排序

    我有一个包含整数列表的列表和另一个包含同时包含整数和字符串的类的列表 我想做的是按字母顺序对列表进行排序 将第一个列表中存在的条目放在前面 这是我的代码和预期输出 using System using System Collections
  • 获取光标相对于控件的位置 - C#

    我想获取鼠标相对于鼠标指针所在控件的位置 这意味着当我将光标置于控件的起点 左上角 时 它应该给出 0 0 我正在使用以下代码 private void panel1 MouseMove object sender MouseEventAr
  • C# 动态 Linq 变量Where 子句

    我正在按照 Scott Gu 的文章创建动态 LINQhttp weblogs asp net scottgu archive 2008 01 07 dynamic linq part 1 using the linq dynamic qu
  • 将 gcov 与 CMake/CDash 结合使用的详细指南?

    我在我的项目中使用 CMake 并设置了 cdash 服务器以进行连续 夜间构建 一切运行良好 通过设置 crontab 我们可以将每小时 每晚的构建 测试结果自动上传到我们的 cdash 服务器 我的下一步是将测试覆盖率报告添加到构建中
  • string.empty 和 string[0] == '\0' 之间的区别

    假设我们有一个字符串 std string str some value is assigned 有什么区别str empty and str 0 0 C 11 及更高版本 string variable 0 如果字符串为空 则需要返回空字
  • 使用 microsoft word.interop 删除 Word 文档中的空白页

    我创建了一个Word文档 它使用以下命令生成动态内容词互操作 它有一些分页符之间使用 我面临的问题是 此分页符会创建我不想向用户显示的空白页面 在某些情况下 我需要在那里添加这些分页符以维护页面布局 因此我无法考虑删除这些分页符 但我想要的
  • C# 列表框 ObservableCollection

    我正在尝试使用 ListBox DataSource ObservableCollection 但是我不知道如何在 OC 更新时让列表框自动更新 我可以在 OC 上挂接 CollectionChanged 事件 但是我需要对列表框执行什么操
  • 如何解决素数函数的大O表示法?

    我正在尝试理解 Big O 表示法 很抱歉 如果我问的问题太明显了 但我似乎无法理解这一点 我有以下 C 代码函数 我正在尝试为其计算 Big O 表示法 for i 2 i lt 100 i for j 2 j lt i j j if i
  • 从 Linq 的列表中选择多个字段

    在 ASP NET C 中 我有一个结构 public struct Data public int item1 public int item2 public int category id public string category
  • 通过 Nuke.Common/NuGet.CommandLine 部署 NuGet 包时如何通过 Azure Auth

    我正在尝试通过 Azure DevOps 上的 Nuke 和 CI CD 自动执行 NuGet 包更新 一切都构建得很好 但在 PushNuGet 步骤中 该过程尝试通过弹出窗口向 Azure 进行身份验证 这显然从未在 in devops
  • 在 C# 4.0 中,是否可以从泛型类型参数派生类?

    我一直在尝试这个 但我似乎无法弄清楚 我想做这个 public abstract class SingletonType
  • C++ 静态工厂构造函数

    我正在进行模拟 它需要创建多个相当相似的模型 我的想法是有一个名为 Model 的类并使用静态工厂方法来构造模型 例如 模型 createTriangle or 模型 createFromFile 我从以前的 java 代码中汲取了这个想法
  • 是否可以从.NET Core中间件检索控制器的操作结果?

    public class UsersController APIControllerBase public UsersController public Client Get return new Client ClientID 1 Las
  • 正则表达式基于组的不同替换?

    所以我对正则表达式比较陌生 并且做了一些练习 我正在玩一个简单的 混淆器 它只是寻找 dot or dot or at or at 不区分大小写 并且在匹配项之前或之后有或没有任意数量的空格 这是针对通常情况的 someemail AT d
  • 为 C++ 类播种 rand()

    我正在开发一个 C 类 它使用rand 在构造函数中 我真的希望这个班级在几乎所有方面都能照顾好自己 但我不知道在哪里播种rand 如果我播种rand 在构造函数中 每次构造我的对象类型的新实例时都会对其进行播种 因此 如果我按顺序创建 3
  • Python 中的 C 指针算术

    我正在尝试将一个简单的 C 程序转换为 Python 但由于我对 C 和 Python 都一无所知 这对我来说很困难 我被 C 指针困住了 有一个函数采用 unsigned long int 指针并将其值添加到 while 循环中的某些变量
  • 构建 OpenCV 时出错 :: MonitorFromRect 未在此范围内声明

    我试图建立OpenCV version 2 4 8与它一起使用CodeBlocks and MinGw 我按照以下指示进行操作here http kevinhughes ca tutorials opencv install on wind
  • GetActiveObject() 与 GetObject() -- MK_E_UNAVAILABLE 错误

    All 我在将一些 VBA 代码转换为 C 时遇到一些问题 我们有一个充当本地 COM 服务器的第 3 方应用程序 在我们使用的VBA代码中获取对象 获取对现有对象的引用 e g Set appHandle GetObject ProgId

随机推荐

  • 为什么我的 Promise 数组在调用 Promise.all() 之前运行?

    我正在尝试创建 Promise 数组 然后使用 Promise all 解析它们 我正在使用 got 它返回一个承诺 我的代码可以工作 但我不完全理解如何工作 这里是 const got require got const url myUr
  • 在 AngularJS 中执行 ng-repeat 内的函数

    我想在 ng repeat 中执行一个函数来检索一些其他数据来显示 例如 我有一份公寓列表 我使用以下方式显示此列表ng repeat 比我想向业主展示的每套公寓 这不是u Apartments So my getInq函数调用服务来获取指
  • Android 驱动程序 JDBC PostgreSQL [重复]

    这个问题在这里已经有答案了 我正在尝试使用 JDBC 驱动程序将我的 Android 应用程序连接到服务器 PostgreSQL 但出现以下错误 java lang ClassNotFoundException org postgresql
  • python 和 networkX keyerror

    我在 python 中遇到这个问题 python 不断给我一个关键错误 重量 g add edge 1 3 weight 2 5 g 1 2 weight 1 5 for n1 n2 attr in g edges data True pr
  • 将 PILLOW 图像转换为 StringIO

    我正在编写一个程序 它可以接收各种常见图像格式的图像 但需要以一种一致的格式检查它们 什么图像格式并不重要 主要是它们都是相同的 由于我需要转换图像格式然后继续处理图像 因此我不想将其保存到磁盘 只需转换它并继续 这是我使用 StringI
  • 编写一个简单的 cron 作业来运行 Java 类

    如何从头开始编写一个 cron 作业来运行 java 类 或者编写一个嵌入 Java 代码来运行的 cron 作业类 以及如何设置计时器每隔一分钟 例如 运行该 cron 作业 注意 完全是 Linux 初学者 这是运行测试作业的示例 sh
  • JNA:结构类中 getFieldOrder() 的用途是什么

    我正在尝试调用 dll 文件中存在的 C 函数 C 函数通过引用将结构对象作为参数 并且函数将在该函数中赋值 因此 在我的 java 应用程序中 为了将结构对象传递给函数 我确实这样写 interface SomeInterface ext
  • 应用顺序/按值调用和正常顺序/按名称调用差异

    背景 我正在根据在线课程学习 sicp 并对其讲义感到困惑 在讲义中 应用顺序似乎等于 cbv 正常顺序等于 cbn 困惑 But the wiki http en wikipedia org wiki Evaluation strateg
  • 使用自定义 std::set 比较器

    我正在尝试将一组整数中项目的默认顺序更改为字典顺序而不是数字顺序 但我无法使用 g 编译以下内容 文件 cpp bool lex compare const int64 t a const int64 t b stringstream s1
  • Rails ActionMailer 与 Devise + Google Apps 处于开发模式

    我正在尝试将 ActionMailer 配置为使用我的 Google Apps 帐户在开发模式下从 Devise 发送邮件 我已将以下内容添加到我的 config environments development rb 文件中 但看起来邮件
  • 动态获取 Javascript 变量中的数据库值

    我多次研究过这个主题 但找不到我的问题的正确答案 让我解释一下 我正在使用 Google Maps API 创建一个应用程序 我希望根据我的数据库值在地图上显示多个位置 我的 javascript 中有一个名为 Locations 的对象
  • 如果缺少 http:// 前缀,请添加到 URL

    你好 我有一个非常简单的代码 a href target self div class callButton Website div a 问题是 如果用户不输入 http 链接将指向我的网站 而不是应有的外部网站 如何在 PHP 中检查用户
  • 动画因过渡而暂停

    我有一个动画移动background position带有关键帧的图像 效果很好 虽然 当用户单击按钮时 我想暂停背景的动画 但要进行过渡 减慢速度然后停止background position从移动 我搜索了类似的东西 但没有找到任何东西
  • 基于 GUI 或基于 Web 的 JSON 编辑器,其工作方式类似于属性资源管理器 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 即使获得焦点并且 CSS 规则生效,HTML 按钮也不会单击

    看看这个按钮 http jsfiddle net vtortola Dnxpe http jsfiddle net vtortola Dnxpe 在Chrome中 如果点击顶部边框 即使 hover 和 active css规则触发 事件也
  • 根据另一个选择选项从数据库提供选择选项

    我有一个表格 有两个选择字段 一个代表地区 一个代表城市 村庄 等的名称 我有一个数据库 其中包含以下形式的所有这些条目 id int 11 ai region varchar 50 city varchar 50 我在这里找到了一个脚本
  • 从图像中删除抗锯齿功能

    我想从图像中删除抗锯齿功能 此代码将从图像中获取 4 种主要颜色 将每个像素与 4 种主要颜色进行比较并分配最接近的颜色 import numpy as np from PIL import Image image Image open p
  • 使用PrincipalContext 和 ADLDS 时 LDAP 服务器不可用

    我们正在利用ADLDS用于我们的用户管理和身份验证 我们可以毫无问题地成功查询实例 但是 尝试执行诸如SetPassword将会失败 或者如果未设置密码 甚至尝试创建新用户也会失败 只要我尝试更新的不是密码 我就可以成功更新用户 我已经阅读
  • SqlCommand 最大参数异常为 2099 个参数

    我在一个 SqlCommand 中对不同的查询进行批处理 当达到 2100 个参数限制时停止批处理查询 如果我的批次有 2100 或 2099 个参数 我仍然会遇到异常 即使参数数量少于 2100 以下测试代码也会抛出 参数过多异常 var
  • 使用 protobuf-net 序列化 [Flags] 枚举时出现 InvalidOperationException

    我正在尝试序列化enum装饰有的类型 Flags 属性 这enum声明如下 Flags ProtoContract EnumPassthru true public enum Categories ProtoEnum Name nameof