反序列化时出现 Protobuf-net memcache 提供程序 null 类型错误

2024-05-05

我正在使用最新的 protobuf-net lib 和 protobuf-net memcache 提供程序。我需要序列化自定义类型 MyClass 的列表

[ProtoContract]
public class MyClass{
  [ProtoMember(1)]
  public int a {get; set;}
  [ProtoMember(2)]
  public int b {get; set;}
}

所以我需要存储/检索:

List<MyClass> myList

当通过 protobuf 存储值然后从缓存中检索值时,一切都会顺利进行。但是,如果值存储在 memcache 中(以正确的 protobuf 格式),即来自另一个线程/应用程序,然后从缓存中检索该值,则由于类型字段的 NullReferenceExceptions,反序列化失败。

因此,当 set 首先执行时,序列化值的类型将存储在 typeCache 变量中,然后从该字典中检索。但是,如果值存在于 memcache 中但未在当前线程 typeCache 中设置,则 var 不包含该类型并在反序列化时抛出 NullReference。

有什么方法可以解决这个问题或解决方法吗?

更深入的调查: enyim 的序列化/反序列化过程实现于ProtoTranscoder.cs。它包含NetTranscoder类有Dictionary<ArraySegment<byte>, Type> typeCache。 因此,当 set 首先进入序列化类型时(即List<MyClass>)存储在typeCachevar 一切顺利。如果值存在于内存缓存中,但在反序列化时未在当前应用程序/线程中设置,则通过以下代码检索:

type = Type.GetType(enc.GetString(buffer, keyOffset, len));
byte[] standaloneBuffer = new byte[len];
Buffer.BlockCopy(buffer, keyOffset, standaloneBuffer, 0, len);
key = new ArraySegment<byte>(standaloneBuffer, 0, len);
sync.EnterWriteLock();
try
   {
        // did somebody beat us to it?
        Type tmp;
        if (typeCache.TryGetValue(key, out tmp)) return tmp;
        typeCache.Add(key, type);
        return type;   <-- Here it returns null, if type not present in typeCache
   }
finally
   {
        sync.ExitWriteLock();
   }

要重现该错误:

  1. 项目清单
  2. 在内存缓存中创建并存储一些列表(使用配置的原始转码器)
  3. 重新启动当前应用程序(或启动另一个线程)
  4. 尝试从“另一个线程”的内存缓存中按键获取值

这是此错误的堆栈跟踪: [ArgumentNullException:值不能为空。 参数名称:类型]

   ProtoBuf.Meta.TypeModel.PrepareDeserialize(Object value, Type& type) in c:\Dev\protobuf-net\protobuf-net\Meta\TypeModel.cs:592
   ProtoBuf.Meta.TypeModel.Deserialize(Stream source, Object value, Type type, SerializationContext context) in c:\Dev\protobuf-net\protobuf-net\Meta\TypeModel.cs:577
   ProtoBuf.Caching.Enyim.NetTranscoder.Enyim.Caching.Memcached.ITranscoder.Deserialize(CacheItem item) in c:\Users\akureniov\work\protobuf-net-1\protobuf-net.Enyim\protobuf-net.Enyim\ProtoTranscoder.cs:109
   Enyim.Caching.MemcachedClient.PerformTryGet(String key, UInt64& cas, Object& value) +179
   Enyim.Caching.MemcachedClient.TryGet(String key, Object& value) +42
   Enyim.Caching.MemcachedClient.Get(String key) +15

在...的帮助下马克·格拉维尔 https://stackoverflow.com/users/23354/marc-gravell我们在 ProtoTranscoder.cs 中的类型修剪中发现了“错误”:NetTranscoder: void WriteType(MemoryStream ms, Type type)。此代码块会导致错误,因为它削减了太多:

int i = typeName.IndexOf(','); // first split
if (i >= 0) { i = typeName.IndexOf(',', i + 1); } // second split
if (i >= 0) { typeName = typeName.Substring(0, i); } // extract type/assembly only

它适用于简单类型,但不适用于列表、字典等。

为了避免这种情况,最好使用正则表达式来删除不必要的信息(例如文化、publickkeytoken 等)。所以这里是一个替换(需要用这个替换上面的行),安静粗鲁,但在大多数情况下工作:

typeName = Regex.Replace(typeName, @", Version=\d+.\d+.\d+.\d+", string.Empty);
typeName = Regex.Replace(typeName, @", Culture=\w+", string.Empty);
typeName = Regex.Replace(typeName, @", PublicKeyToken=\w+", string.Empty);

此正则表达式不会剪切类型的程序集,而这是自定义类型所需要的。但对于标准类型来说是mscorlib在大多数情况下,可以通过添加另一行来安全删除它:

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

反序列化时出现 Protobuf-net memcache 提供程序 null 类型错误 的相关文章

  • 如何 XML 序列化 DateTimeOffset 属性?

    The DateTimeOffset当数据表示为 Xml 时 我在此类中拥有的属性不会呈现 我需要做什么来告诉 Xml 序列化将其正确呈现为DateTime or DateTimeOffset XmlRoot playersConnecte
  • 获取 System.Drawing.Font 宽度?

    我正在使用 Net 工具进行一些 2D 绘图 System Drawing Font uses a GetHeight 返回以像素为单位的高度 我缺少一个GetWidth 检索宽度 我应该用什么 Use Graphics MeasureSt
  • 如何为 LINQ 查询构建动态 FROM 子句?

    我有一个标准 LINQ 查询 var list from x in SomeDataContext ViewName where Rest of where clause select x 我想知道是否可以构建动态 LINQ 查询 以便我可
  • 点击浏览器后退按钮时如何刷新 ASP .NET MVC 页面

    我刚刚发现 当我单击任何 ASP NET MVC 页面上的浏览器后退按钮时 没有任何反应 并且页面不会更新 并且只有当您单击 F5 时才会更新 主要问题是我对页面的 DOM 进行了一些更改 即添加表格行 选择单选按钮等 当我通过点击浏览器后
  • 在 .Net 应用程序中使用 Active Directory Web 服务

    我正在尝试构建一个 Net 应用程序来询问 Active Directory 编辑 我需要使用 Web 服务来执行此操作 因为我将使用需要使用 Web 服务的第三方工作流工具从 Sharepoint 工作流与 AD 进行通信 根据我的研究
  • C# 中 DLL 和命名空间的关系

    这里有一个高级问题 今天我花了很多时间自学基本的高级概念 例如 API 静态和动态库 DLL 以及 C 中的编组 获得所有这些知识让我想到了一个看起来非常基本的问题 并且可能表明我对这些概念的理解存在漏洞 我知道的 DLL 可能包含类 这些
  • Python tkinter.filedialog Askfolder 干扰 clr

    我主要在 Spyder 中工作 构建需要弹出文件夹或文件浏览窗口的脚本 下面的代码在spyder中完美运行 在 Pycharm 中 askopenfilename工作良好 同时askdirectory什么都不做 卡住了 但是 如果在调试模式
  • TextBox 焦点的 WinForms 事件?

    我想添加一个偶数TextBox当它有焦点时 我知道我可以用一个简单的方法来做到这一点textbox1 Focus并检查布尔值 但我不想那样做 我想这样做 this tGID Focus new System EventHandler thi
  • .Net 中是否有与 HTML 等效的 XmlReader?

    我用过Html敏捷包 http html agility pack net z codeplex过去在 Net 中解析 HTML 但我不喜欢它只使用 DOM 模型 在大型文档和 或具有大量嵌套的文档上 可能会遇到堆栈溢出或内存不足异常 另外
  • 应用服务中的内存利用率是否可​​以提高

    我有一个相当简单的 Web 应用程序在 Azure 的 B1 服务计划中的应用服务计划中运行 该计划提供 1 个 CPU 和 1 75GB RAM CPU 使用率永远不会超过 5 左右 内存使用率永远不会低于 52 我确实停止了计划中唯一运
  • 如何在没有互联网连接的情况下安装 NuGet 包?

    目前我正在一台不允许访问互联网的虚拟电脑上进行开发 我设法获取 NuGet Tools vsix 将 NuGet 添加到 Visual Studio 2010 但似乎无法找出如何离线部署 NuGet 包 例如 我下载了EntityFrame
  • 是否可以调整AppFabric缓存服务器来存储更大的对象?

    当我假设将较大的对象图添加到缓存中时 我收到 AppFabric 缓存服务器错误 错误代码 子状态 连接已终止 可能是由于服务器或网络问题或序列化对象大小大于服务器上的 MaxBufferSize 请求的结果未知 我确信这不是网络问题 我能
  • MonoState、Singleton 或派生形式:CRUD 应用程序的最佳方法?

    我有一个相当大的 CRUD WinForm 应用程序 其中有许多对象 人员 注册 计划 案例注释等 该应用程序由 30 多种表单组成 UI 逻辑上被分解 会员 注册 计划 案例说明等 我正在尝试弄清楚如何创建我的人物对象搜索后搜索表格并将对
  • 从 .net 应用程序登录 OpenID 站点

    我一直在考虑编写一个小工具来登录 SO 并定期使用一些主题 当前信息更新我的个人资料信息 例如我最新的博客文章或我需要帮助的问题等 为了让它工作 我需要以某种方式从控制台应用程序登录到SO 是否有一个 Net 库可以简化使用原始 http
  • 如何在 wpf 应用程序的代码隐藏中创建集合视图源

    我有以下代码 public partial class MainWindow Window public MainWindow InitializeComponent var entities new DemoEntities var de
  • 有没有办法在不重新编译的情况下覆盖 .NET Windows 服务名称?

    我有一个 Windows 服务可执行文件 我知道它是用 NET 编写的 我需要将其安装在不同的服务名称下以避免冲突 安装无论如何都不提供指定服务名称 如果我只能访问二进制文件 当我使用 installutil 安装它时是否可以覆盖服务名称
  • 模拟对象 - 将所有方法声明为虚拟方法还是使用接口?

    与 Java 不同 net 中的方法默认不是虚拟的 为了使用大多数模拟对象框架 您要么必须将要在模拟上使用的方法标记为 真实 对象上的虚拟方法 要么必须有一个可以模拟被测试类将使用的接口接受代替执行 将每个方法标记为虚拟似乎是一种不好的形式
  • 什么可以解释托管堆上超过 5,000,000 个 System.WeakReference 实例?

    我一直在针对生产 ASP NET Web 应用程序运行负载测试 并且看到在堆上创建了大量 System WeakReference 在大约 15 分钟内 负载管理堆内存已飙升至大约 3GB 并且我有大约 5 000 000 个对 Syste
  • .Net应用程序设置路径

    默认情况下 Windows 应用程序设置保存在该目录中 USERPROFILE Local Settings Application Data
  • 线程睡眠和Windows服务

    我正在开发一个 Windows 服务 该服务存在一些问题Thread Sleep 所以我想我会尝试使用计时器 因为这个问题建议 在 Windows 服务中使用 Thread Sleep https stackoverflow com que

随机推荐

  • 如何避免.NET DLL文件被反汇编? [复制]

    这个问题在这里已经有答案了 我正在编写一个 NET 应用程序 一个 Windows 类库 来实现我们产品的许可 问题是 DLL 可以很容易地被 MSIL 反汇编器或任何其他第三方工具反汇编 并且可以很容易地破解代码 我什至尝试过在程序集上签
  • 生成所有可能的排列(或 n 元组)

    我想创建一个包含 10 个变量 可以是 1 或 2 的所有可能排列的 data frame 2 2 2 2 2 2 2 2 2 2 1024 possible 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1
  • 列切换按钮不会触发回调操作

    在下面的JSFiddle https jsfiddle net asanchez4096 urd5gquc 每当选择列可见性按钮中选择列的按钮时 操作函数都不会触发 下面是我正在使用的代码 document ready function v
  • Windows 批处理:如何添加主机条目?

    我想使用此批处理脚本通过使用自动将新条目添加到我的主机文件中windows questions tagged windows batch 不幸的是 剧本只需在主机文件中添加一行 当我以管理员身份运行脚本时 又出了什么问题 echo off
  • 从 celery 工作人员到普罗米修斯的自定义指标

    我有一些 celery 工作人员在 kubernetes 下的容器中运行 它们不会由 celery 自动缩放 并且每个都在单个进程中运行 即没有多处理 我想从他们那里获取一堆不同的指标到普罗米修斯中 我研究过 celery promethe
  • 实时数据监控:PyQtGraph

    我正在开展一个项目 我必须分析来自设备的信号 我有一个正在运行的库 它可以从设备获取数据 截至目前 我正在收集数据 然后绘制它 我有兴趣构建一个可以实时绘制图表的实时数据监视器 经过搜索 我发现 PyQtGraph 非常适合这项任务 我对
  • 如何在 Flutter 中创建网络图像列表

    我使用 Carousel Pro 包在屏幕上实现轮播 在这个 Carousel 类中它需要一个图像列表 Carousel 类的语法是 Carousel images NetworkImage https cdn images 1 mediu
  • 如何在android中使用进度条填充图像

    我正在做一个项目 它需要填充图像 意味着我想使用图像形状作为进度条 我不知道如何使用自定义进度栏 这是一个图像及其图像按钮 这是进度为 100 时的情况 这是 0 进度 您需要了解可绘制资源 可绘制资源 安卓开发者 https develo
  • python 请求上传文件

    我正在访问一个网站 并且想要上传一个文件 我用Python编写了代码 import requests url http example com files file open 1 jpg rb r requests post url fil
  • 如何在SVG中实现橡皮擦功能?

    我认为 SVG 在某些功能上比 HTML5 canvas 更好 但我无法想象一种简单的方法来实现橡皮擦功能 我有什么方法或例子吗 这是一种非常笨拙的方法 但您可以简单地用白色描边模仿标准钢笔工具
  • 通过 Travis-CI 部署到 Heroku 的问题

    在使用 Heroku 部署时 我不断收到此错误 并且在通过 Travis 运行构建后尝试部署到 Heroku 时 我一直收到几个不同的报告 No stash entries found API request failed Message
  • 为什么添加多重处理会阻止 python 找到我编译的 c 程序?

    我目前正在寻求利用多处理的力量来加速我的代码 然而 当我从 python 调用编译后的代码时遇到了一些问题 因为当编译后的文件包含任何形式的多处理时 它似乎从代码的视图中消失了 例如 使用以下测试代码 include
  • Java 从我创建的另一个类访问数组元素

    我正在使用 main 方法在类中创建一个数组 Word attempts new Word 26 Word 类中的字段是 private String attempts Word 类中的构造函数是 public Word int a att
  • 如何在没有io的情况下在windows上创建特定大小的文件?

    Windows 上是否有与 posix fallocate 等效的函数 具体来说 我正在寻找一种方法来立即 无需执行大量 IO 创建特定大小的文件 我不关心内容 我尝试过 chsize s 它确实分配了文件 但需要很长时间 如果我右键单击文
  • Swift 2 中的 segue 没有后退按钮

    我刚刚将我的项目移植到 Swift 2 一切都运行良好 除了即使是最简单的 segues 也没有后退按钮 这是我正在使用的 segue 函数的准备 override func prepareForSegue segue UIStoryboa
  • Flutter如何向用户显示FPS(每秒帧数)?

    有没有办法在 Flutter 中向用户显示 FPS 又称每秒帧数 有没有任何小部件或包 Note 我在测试期间并没有要求 FPS 截屏 Code 我不知道是否有一个包可以帮助您不断地向用户显示 FPS 但如果您想手动执行此操作 您可以尝试以
  • 如果布局中有两张卡,则第二张卡下方没有阴影/高程。为什么?

    我有2个cards在一个单一的RelativeLayout 问题是第二张卡下方没有高程或阴影 请参阅此处的屏幕截图 截屏 https i stack imgur com oOWIT jpg 这是我在 xml 文件中所做的
  • 在 Django 中创建持久数据对象

    我有一个基于 Python 的最大熵分类器 它很大 存储为 Pickle 大约需要一分钟才能反序列化 它也不是线程安全的 然而 它运行速度很快 可以在几毫秒内对样本 一个简单的 Python 字典 进行分类 我想创建一个基本的 Django
  • Android 中的布局和容器有什么区别?

    在android studio中 在设计部分 布局和容器是分开分类的 它们之间的根本区别是什么 Layouts全部直接延伸ViewGroup The Layout后缀是该组中类的类名的一部分 例如LinearLayout RelativeL
  • 反序列化时出现 Protobuf-net memcache 提供程序 null 类型错误

    我正在使用最新的 protobuf net lib 和 protobuf net memcache 提供程序 我需要序列化自定义类型 MyClass 的列表 ProtoContract public class MyClass ProtoM