.NET 4.5 MethodInfo 序列化重大更改

2024-03-28

问题

一个对象(带有私有MethodInfo使用程序集 1.0 版本序列化的字段)不会使用该程序集的 1.1 版本(aSerializationException将被抛出,因为尚未找到所需的方法)。

发生了什么变化?

我发现.NET 4.5中的序列化机制MemberInfo via MemberInfoSerializationHolder已经变了。在过去(直到 .NET 4.0),序列化数据是方法签名(通过简单的方法获得)MethodInfo.ToString())。 根据 .NET 源代码中的注释,他们添加了通过以下方式获得的第二个签名SerializationToString()因为:

m_signature 存储成员的 ToString() 表示形式,该表示形式有时是不明确的。相同方法或属性的多个重载可以相同的 ToString()。 m_signature2 存储 SerializationToString() 表示形式,该表示形式对于每个成员应该是唯一的。它仅由 4.0 之后的 CLR 版本编写和使用。

对于我所看到的MemberInfoSerializationHolder.GetRealObject()使用此(简化的)代码来解析该方法(来自 .NET 源代码):

for (int i = 0; i < methods.Length; i++)
{ 
    if (m_signature2 != null) // SerializationToString() signature
    {
        if (((RuntimeMethodInfo)methods[i]).SerializationToString().Equals(m_signature2))
        { 
            methodInfo = methods[i];
            break; 
        } 
    }
    else 
    {
        if (methods[i].ToString().Equals(m_signature))
        { 
            methodInfo = methods[i];
            break; 
        }
    }
}

if (methodInfo == null)
    throw new SerializationException(...);

在这种情况下,反序列化失败,因为m_signature2找不到签名,因为程序集名称包含版本信息String.Equals()不会匹配MyAssembly, Version=1.0.0.0 with MyAssembly, Version=1.1.0.0并且会抛出异常。

问题

我预计框架会失败old搜索方法,如果new搜索失败(至少因为与现有代码的兼容性)。我不明白为什么要与String.Equals(),在运行时解析了程序集的所有版本之后(默认情况下将加载较新的版本),我同意它无法解析那里的程序集版本,但如果strict搜索失败。

我知道连载起来很糟糕MethodInfo但目前此修复可能涉及太多更改(架构和代码方面),并且没有人会在旧代码中开始这种重构(此外,必须在新旧版本两个方向上保持存档的二进制兼容性)。

到目前为止我还没有尝试过,但是这个问题也适用于代表吗? 是否有任何解决方案(使用属性或小的代码更改)来解决此问题?


我能想到的最好的方法是实施ISerializable ( MSDN http://msdn.microsoft.com/en-us/library/system.runtime.serialization.iserializable.aspx )

在对象上实现此接口MethodInfo属性使您可以完全控制序列化/反序列化。

缺点是您还必须以某种通用方式处理所有其他属性。不过应该是可行的。

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

.NET 4.5 MethodInfo 序列化重大更改 的相关文章

  • 当应用程序终止时,我可以安全地依赖 Threads 中的 IsBackground 吗?

    我正在 GUI 中运行一些后台线程 目前 我正在实现个人线程取消代码 但线程中有 IsBackground 属性 根据 MSDN 它们会自行取消 我知道它将进入 Thread Abort 这很令人讨厌 但是在这个后台线程中没有任何事情需要我
  • 尝试从 C# 服务查询 IIS 时出现异常

    我从使用 C 编写的 Windows 服务调用以下代码 try ServerManager m new ServerManager if m null SiteCollection sites m Sites I get exception
  • 当移动到控件的 ScrollBar 上时触发 MouseLeave 事件

    由于无法解决问题 我重新发布此问题 原始here https stackoverflow com questions 2024393 treeview mouseleave event fires when moves over scrol
  • 对 ExecuteNonQuery() 的单次调用是原子的

    对 ExecuteNonQuery 的单次调用是否是原子的 或者如果单个 DbCommand 中有多个 sql 语句 那么使用事务是否有意义 请参阅我的示例以进行说明 using var ts new TransactionScope us
  • 为什么像 BindingList 或 ObservableCollection 这样的类不是线程安全的?

    我一次又一次发现自己必须编写 BindingList 和 ObservableCollection 的线程安全版本 因为当绑定到 UI 时 这些控件无法从多个线程更改 我想理解的是why情况就是这样 这是设计错误还是故意的 问题是设计一个线
  • Control.Invoke 是否泵送消息?

    Control Invoke 在被阻塞时是否继续在调用它的线程中泵送消息 系统 Windows 窗体 不会 Invoke 是阻塞的 整个线程将阻塞 直到对 Invoke 的调用返回 还有开始调用 http msdn microsoft co
  • 在 C# .NET 中对非 ASCII 字符进行编码

    我想向我的应用程序发送的电子邮件添加自定义标头 标头名称只能包含 ASCII 字符 但对于值和用户可能会输入 UTF 8 字符 我必须对它们进行 Base64 编码 此外 我还必须将它们解码回 UTF 8 以便在 UI 中向用户显示它们 最
  • 将 Cookie 从 CookieContainer 写入 IE Cookie 存储

    我想从桌面应用程序导航到 Web 应用程序中的页面 没问题 我听到你说 只需使用正确的 URL 启动默认浏览器即可 但是 Web 应用程序使用 ASP NET 表单身份验证 用户不想看到登录页面 因为他们已经在桌面应用程序中使用相同的凭据进
  • 禁用数据表更改跟踪

    有没有办法让数据表自动接受更改或在修改行时禁用更改跟踪 当更改数据表时 忘记调用DataTable AcceptChanges 可能会导致真正的问题 我认为整个要点DataTable是具有行版本控制和更改跟踪的额外好处 我认为您实际上无法禁
  • 为什么发布和调试模式下的代码行为不同?

    考虑以下代码 private static void Main string args var ar new double 100 FillTo ref ar 5 Console WriteLine string Join ar Selec
  • 如何确保使用 Microsoft Sync Framework 同步成功?

    我正在使用微软同步框架 https msdn microsoft com en us sync bb736753 aspx同步两个 Microsoft SQL Server 上的表 我创建了一个测试应用程序 它每秒在远程服务器上的表中生成一
  • ToUpperInvariant() – MSDN 的建议是否错误?

    In 在 NET Framework 中使用字符串的最佳实践 https msdn microsoft com en us library dd465121 v vs 110 aspx 字符串比较OrdinalIgnoreCase http
  • 找不到文件异常..但它就在那里

    嘿 这将是那些愚蠢的问题之一 我试图在本地系统上获取一个文件 但我不断收到FileNotFoundException thrown 请有人纠正我 if File Exists C logs hw healthways prod 2009 0
  • 使用 SSL 设置 .Net IBM.XMS 客户端

    我必须创建一个客户端来侦听队列上的消息 正在使用 SSL 我正在 dot net 中进行开发 我浏览了数百页的文档和论坛 找到了一些清晰简洁的内容 但看起来事实并非如此 我有一个 jks 并且我能够 telnet 到正在发布队列的服务器 下
  • .NET WebBrowser 控件可以使用 IE9 吗?

    我意识到这是一个早期版本并且不稳定 我不会梦想在任何其他项目中将默认的 Web 浏览器控件替换为 IE9 但在这种情况下 我特别需要 IE9 与其他版本进行比较 我想让 NET WebBrowser 控件使用 IE9 而不是机器上默认版本的
  • 同步执行异步函数

    我对此主题进行了大量搜索 并且阅读了本网站上有关此主题的大部分帖子 但是我仍然感到困惑 我需要一个直接的答案 这是我的情况 我有一个已建立的 Winform 应用程序 但无法使其全部 异步 我现在被迫使用一个全部编写为异步函数的外部库 在我
  • 如何让实体框架初始化新创建的实体上的集合?

    我正在尝试用一些测试数据来种子我的数据库IDatabaseIntialiser像这样 protected override void Seed BlogDataContext context
  • win32 API 和 .NET 框架之间的选择

    我必须开发一个适用于 Windows 的应用程序 该应用程序将能够通过网络摄像头识别手势来控制鼠标 我将使用 vc 2008 进行开发 但我很困惑是使用 NET 框架还是核心 win32 API 性能对于我的应用程序非常重要 根据 Ivor
  • 哪些 .NET 编程语言有 CodeDom 提供程序?

    除了 C VB NET C 托管和 C CLI 和 F 之外 哪些 NET 编程语言有自己的 CodeDom 提供程序 我考虑过为 UnrealScript 制作一个 但我遇到了一些奇怪的问题 比如代码二进制运算符类型 http msdn
  • 具有多种类型的 C# 泛型类型推断

    我有以下通用方法 用于将一种类型的输入对象序列化为超类型 如下所示 public string SerialiseAs

随机推荐

  • 部署套件建议[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我在 Net 4 0 下编写了一些应
  • iOS 8 代码适用于 iPhone 5s,但不适用于 iPhone 5

    在 iPhone 5s 模拟器上一直测试我的 spritekit 游戏后 我终于尝试在 iPhone 5 模拟器上运行它 不幸的是 当我第一次触摸时 我就收到了一个我不明白的错误 我的touchesBegan函数调用我的addCoin函数
  • React router dom将数据从父组件传递到子路由器组件不传递props.match

    父组件App js的内容 import React useEffect useState from react import NavBar from components NavBar import Signup from pages Si
  • 如何使 formControl 只读

    如何以角度只读方式制作表单控件 我知道我可以用 html 来做
  • Numpy 索引重新排序数组

    我刚刚偶然发现了一个我不太理解的 numpy 索引行为 看起来 numpy 正在根据索引模式改变我的轴的顺序 不幸的是 我在文档中找不到以下内容的解释 有人可以向我解释一下发生了什么事吗 This is expected dimension
  • SignalR 响应覆盖标头

    我构建了一个位于 WebAPI 服务中的简单 SignalR 中心 并在 WebAPI 和 SignalR 上包含了所有必需的 CORS 属性 我的 WebAPI 端点都按预期工作 但 SignalR 却没有 我已经尝试了我能想到的所有方法
  • C中使用函数计算数组长度

    我想创建一个函数来计算传递数组的大小 我将传递一个数组作为输入 它应该返回其长度 我想要一个函数 int ArraySize int Array Or int Array Calculate Length of Array and Retu
  • Dash Python 应用程序按钮用于操作和刷新页面

    Dash App 中需要有一个回调函数来执行某些操作然后刷新页面 只能使用 HTML A 标签实现页面重新加载 html A html Button Refresh Data href 必需的 app layout html Div htm
  • 为什么 std::vector::insert 需要复制赋值?

    我试图理解以下行为 include
  • 在 Python 中使用 Nan 对图像进行高斯滤波

    根据 2D 坐标列表和第三个变量 速度 我创建了一个覆盖整个采样区域的 2D numpy 数组 我的目的是创建一个图像 其中每个像素包含位于其中的点的平均速度 之后用高斯滤波器过滤该图像 问题是该区域没有均匀采样 因此我有几个没有信息的像素
  • iOS:当应用程序因崩溃而退出时,是否有任何委托方法

    当我的应用程序因内存不足 内存泄漏等一般崩溃而崩溃时退出时 我想与我的服务器进行一些交互 我想知道 在这种情况下是否会调用任何委托方法 以便我可以在应用程序因任何崩溃而退出之前快速联系我的服务器 谢谢 正如您所解释的 您需要联系服务器 您可
  • C 中带有 const 的“私有”结构成员

    为了拥有干净的代码 使用一些 OO 概念可能很有用 即使在 C 中也是如此 我经常编写由一对 h 和 c 文件组成的模块 问题是模块的用户必须小心 因为 C 中不存在私有成员 使用 pimpl 习惯用法或抽象数据类型是可以的 但它添加了一些
  • Gitlab 管道 - 报告配置包含未知键:cobertura

    由于此错误 我无法运行 gitlab 管道 Invalid CI config YAML file jobs run tests artifacts reports config contains unknown keys cobertur
  • 如何在 iPhone 中获取时差

    我有 2 个包含时间值的数组 它们采用以下格式 mm ss 数百秒 我想获得数组中两个 lastObjects 之间的差异 NSDate 不起作用 因为最后一个值以百分之一秒为单位 一个问题 如果第二个日期比第一个日期大 它会给我一个负数
  • FlowDocument 强制分页(之前分页)

    我使用 C 创建 FlowDocument 并用表中的数据填充它 Example FlowDocument flowDoc new FlowDocument Table table1 new Table flowDoc Blocks Add
  • 从 JQuery 附加 Laravel Blade

    我正在尝试从 Laravel 附加 Blade 语法 但无法让浏览器理解 Blade 当我从 js 文件附加 Blade 语法时 它将代码输出到页面上 this is my code Current box append if errors
  • 是什么导致 System.Drawing.Printing.PrinterSettings.InstalledPrinters 抛出 Win32Exception“RPC 服务器不可用”?

    我正在开发一个应用程序 我允许用户在从应用程序打印表单时选择一台打印机用作他们的打印机 我正在使用 NET 2 0 在设置屏幕中 我调用 System Drawing Printing PrinterSettings InstalledPr
  • Android ListView:获取可见项的数据索引

    我有一个安卓ListView创建与SimpleAdapter里面的项目多于屏幕所能容纳的项目 滚动列表后 我需要获取列表中第一个可见项目在数据模型中的位置 基本上我想要一个像这样的函数 listView getChildAt 0 getPo
  • 使用javascript比较路径并获取两个文件之间的相对路径

    如何动态比较同一域中的两个路径并获取它们之间的相对路径 var path2 http site net test1 test2 img 1 jpg test example var path3 http site net test1 img
  • .NET 4.5 MethodInfo 序列化重大更改

    问题 一个对象 带有私有MethodInfo使用程序集 1 0 版本序列化的字段 不会使用该程序集的 1 1 版本 aSerializationException将被抛出 因为尚未找到所需的方法 发生了什么变化 我发现 NET 4 5中的序