Base64 反序列化期间的空引用异常 (C#)

2024-01-09

我使用以下方法来序列化和反序列化 .NET 对象:

public static string SerializeToBase64(object data)
{
    var stream = new MemoryStream();
    var formatter = new BinaryFormatter();
    formatter.Serialize(stream, data);
    stream.Position = 0;
    return Convert.ToBase64String(stream.ToArray());
}

public static object DeserializeFromBase64(string data)
{
    var stream = new MemoryStream(Convert.FromBase64String(data));
    stream.Position = 0;
    var formatter = new BinaryFormatter();
    return formatter.Deserialize(stream);
}

当使用标记有 [Serialized] 属性的简单类时,这些方法似乎工作得很好。

但我需要使用此代码来序列化由 ORM 框架创建的实体类(也可序列化),其中每个实体类都派生自我没有源代码的基类。

当处理实体类的实例时,它会毫无异常地完成序列化,但反序列化在执行 formatter.Deserialize() 时总是抛出空引用异常。

我对序列化的过程不是很熟悉,但我认为这个问题一定是由目标对象的状态异常引起的。对象在序列化之前是否必须满足一组标准条件?

任何其他调试建议将不胜感激。

谢谢, 蒂姆

UPDATE:

经过进一步的实验,我想我已经找到了问题的原因。目标对象具有由另一个未标记为可序列化的类处理的事件,如中所述这个帖子 http://quickduck.com/blog/2007/02/12/how-to-prevent-serialization-of-event-handlers/.

有趣的是,即使附加了事件处理程序,序列化也能正常工作——反序列化​​会失败。

但我已经通过暂时删除事件处理程序进行了测试,并且序列化和反序列化都正常工作,所以我认为这就是问题所在。但是,由于我无权访问声明事件的代码,因此我无法立即了解如何实现上述解决方案。我可能必须修改序列化过程以删除然后恢复事件处理程序。


它是哪个 ORM 框架?请注意,ORM 生成的类型往往是特别与使用时令人讨厌BinaryFormatter,因为它们并不总是“POCO”:它们通常具有与 ORM 相关的字段 - 因此独立创建它们会出现问题。简而言之,我不是hugely惊讶的是它在这种情况下不起作用。

您可能想考虑使用类似的东西DataContractSerializer, XmlSerializer,protobuf-net,或者也许NetDataContractSerializer- 这些都完成类似的工作,但是因为它们在公共财产(而不是领域)上工作,所以它们tend更有效 - 事实上许多人都内置支持这些方法用作 DTO。

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

Base64 反序列化期间的空引用异常 (C#) 的相关文章

  • 如何使用MemoryCache代替Timer来触发一个方法?

    以下方法通过等待已运行操作的结果来处理并发请求 对数据的请求可能会使用相同 不同的凭据同时出现 对于每组唯一的凭据 最多可以有一个GetCurrentInternal呼叫正在进行中 当准备就绪时 该呼叫的结果将返回给所有排队的服务员 pri
  • C++ 中本地类中的静态成员变量?

    我知道我们不能宣布static本地类中的成员变量 但其原因尚不清楚 那么请问有人可以解释一下吗 另外 为什么我们不能访问非static函数内部定义的变量 内部已经定义了局部类 直接在局部类成员函数中 在下面给出的代码中 int main i
  • Unix网络编程澄清

    我正在翻阅这本经典书籍Unix网络编程 https rads stackoverflow com amzn click com 0139498761 当我偶然发现这个程序时 第 6 8 节 第 179 180 页 include unp h
  • 在新的浏览器进程中打开 URL

    我需要在新的浏览器进程中打开 URL 当浏览器进程退出时我需要收到通知 我当前使用的代码如下 Process browser new Process browser EnableRaisingEvents true browser Star
  • 读取文件特定行号的有效方法。 (奖励:Python 手册印刷错误)

    我有一个 100 GB 的文本文件 它是来自数据库的 BCP 转储 当我尝试导入它时BULK INSERT 我在第 219506324 行上收到一个神秘错误 在解决此问题之前 我想看看这一行 但可惜的是我最喜欢的方法 import line
  • 存储来自其他程序的事件

    我想将其他应用程序的事件存储在我自己的应用程序中 事件示例 打开 最小化 Word 或打开文件时 这样的事可能吗 运行程序 http msdn microsoft com en us library ms813609 aspx and 打开
  • 未定义的行为或误报

    我 基本上 在野外遇到过以下情况 x x 5 显然 它可以在早期版本的 gcc 下编译干净 在 gcc 4 5 1 下生成警告 据我所知 警告是由 Wsequence point 生成的 所以我的问题是 这是否违反了标准中关于在序列点之间操
  • PlaySound 可在 Visual Studio 中运行,但不能在独立 exe 中运行

    我正在尝试使用 Visual Studio 在 C 中播放 wav 文件 我将文件 my wav 放入项目目录中并使用代码 PlaySound TEXT my wav NULL SND FILENAME SND SYNC 我按下播放按钮 或
  • Visual Studio 中的测试单独成功,但一组失败

    当我在 Visual Studio 中单独运行测试时 它们都顺利通过 然而 当我同时运行所有这些时 有些通过 有些失败 我尝试在每个测试方法之间暂停 1 秒 但没有成功 有任何想法吗 在此先感谢您的帮助 你们可能有一些共享数据 检查正在使用
  • 如何使用 Mongodb C# 驱动程序连接多个集合

    我需要将 3 个集合与多个集合合并在一起 lookup我在 C 驱动程序中尝试过 它允许我 lookup用户采集但无法执行秒 lookup用于设置集合 有人可以帮忙吗 db Transactions aggregate lookup fro
  • 等待线程完成

    private void button1 Click object sender EventArgs e for int i 0 i lt 15 i Thread nova new Thread Method nova Start list
  • std::async 与重载函数

    可能的重复 std bind 重载解析 https stackoverflow com questions 4159487 stdbind overload resolution 考虑以下 C 示例 class A public int f
  • (de)从 CSV 序列化为对象(或者最好是类型对象的列表)

    我是一名 C 程序员 试图学习 C 似乎有一些内置的对象序列化 但我在这里有点不知所措 我被要求将测试数据从 CSV 文件加载到对象集合中 CSV 比 xml 更受青睐 因为它更简单且更易于人类阅读 我们正在创建测试数据来运行单元测试 该集
  • gcc 的配置选项如何确定默认枚举大小(短或非短)?

    我尝试了一些 gcc 编译器来查看默认枚举大小是否很短 至少一个字节 强制使用 fshort enums 或无短 至少 4 个字节 强制使用 fno short enums user host echo Static assert 4 si
  • C++ 密码屏蔽

    我正在编写一个代码来接收密码输入 下面是我的代码 程序运行良好 但问题是除了数字和字母字符之外的其他键也被读取 例如删除 插入等 我知道如何避免它吗 特q string pw char c while c 13 Loop until Ent
  • 为什么在setsid()之前fork()

    Why fork before setsid 守护进程 基本上 如果我想将一个进程与其控制终端分离并使其成为进程组领导者 我使用setsid 之前没有分叉就这样做是行不通的 Why 首先 setsid 将使您的进程成为进程组的领导者 但它也
  • 如何在按钮单击时模拟按键 - Unity

    我对 Unity 中的脚本编写非常陌生 我正在尝试创建一个按钮 一旦单击它就需要模拟按下 F 键 要拾取一个项目 这是我当前的代码 在编写此代码之前我浏览了所有统一论坛 但找不到任何有效的东西 Code using System Colle
  • 编译时“strlen()”有效吗?

    有时需要将字符串的长度与常量进行比较 例如 if line length gt 2 Do something 但我试图避免在代码中使用 魔法 常量 通常我使用这样的代码 if line length gt strlen Do somethi
  • memset 未填充数组

    u32 iterations 5 u32 ecx u32 malloc sizeof u32 iterations memset ecx 0xBAADF00D sizeof u32 iterations printf 8X n ecx 0
  • 检查Windows控制台中是否按下了键[重复]

    这个问题在这里已经有答案了 可能的重复 C 控制台键盘事件 https stackoverflow com questions 2067893 c console keyboard events 我希望 Windows 控制台程序在按下某个

随机推荐

  • Silverlight - 在 XAML 中而不是在构造函数中设置 DataContext?

    如何在 XAML 中而不是在构造函数中设置 Grid 上的 DataContext 以下是我在构造函数中执行此操作的方法 LayoutRoot 是 XAML 中定义的 XAML 网格 this LayoutRoot DataContext
  • 使用共享静态 WCF 代理客户端有哪些陷阱?

    我正在考虑将共享 读取静态 WCF 代理客户端用于高吞吐量应用程序 我相信这样做可以提高性能 但我还没有对此进行基准测试 这个想法有一些严重的缺陷吗 从我的研究中 我可以看到存在处理故障状态的问题 目前尚不清楚该状态对其他待处理请求的影响流
  • Django/Python - 每秒更新数据库

    我正在努力用 Django 和 Python 创建一个基于浏览器的游戏 并且我正在尝试为我遇到的问题之一找到解决方案 本质上 每一秒都需要更新多个用户变量 例如 有一个货币变量应该每秒增加一定数量 随着你的升级和所有这些爵士乐而逐渐变大 我
  • 在 Kotlin 中编写 React Native Android 模块?

    React Native 文档提供了吐司模块 https facebook github io react native docs native modules android html用java编写的例子 同样的例子在 Kotlin 中是
  • JSON和Unity,在游戏上显示图像[重复]

    这个问题在这里已经有答案了 我有一个测验游戏应用程序 并且我有游戏上的图像 我想显示图像 文本显示得很好 但图像却不是 这是我的 JSON C 代码 点击这里图片 https i stack imgur com AEaFB png 调用我的
  • 为什么 Rails 不断发回 Set-Cookie 标头?

    我遇到了弹性负载均衡器和清漆缓存的问题 涉及 cookie 和会话在 Rails 和客户端之间混淆 问题的一部分是 rails 几乎在每个请求上都添加了一个带有会话 ID 的 Set Cookie 标头 如果客户端已经发送session i
  • 谜题:在四个反射墙内,激光束可以通过多少种方式击中目标

    你在一个长方形的房间里遇到敌人 你只有一把激光武器 房间里没有任何障碍物 墙壁可以完全反射激光束 然而 激光只能传播一定的距离 然后就变得毫无用处 如果它撞到角落 它会沿着它来的方向反射回来 这就是谜题的进行方式 您将获得自己所在位置和目标
  • 对汇编中的指针和值感到困惑

    我正在使用 MASM 汇编器 让我们看一下这段简短的代码 来自我读过的一本书 data var1 BYTE 10h code main proc mov esi OFFSET byteVal mov al esi AL 10h 我不太明白
  • 如何计算多个纬度和经度之间的距离?

    I want to calculate total distance between each points both contains lat and long these points are stored in local datab
  • 如何创建 jQuery 价格滑块

    我一直在尝试寻找教程 但没有成功 我并不是要求任何人为我做这项工作 而是更多地看看是否有人知道任何有用的东西 所以基本上我需要我的滑块具有最小值为零和动态设置的最大值 获取动态值不是问题 0 o 200 所以中间的 o 将是可点击的滑动元素
  • 使用 jQuery 从 URL 加载动态 div 内容

    我有一个 jQuery 搜索脚本 它使用选项卡让用户定义他们想要使用的搜索类型 当用户搜索时 会创建一个类似于 的 URLtype query 当您重新加载页面时 结果丢失的原因是它们不在文档源中 它们后来被添加到 DOM 中 我认为你有两
  • 如何在c#中仅在耳机的左声道和仅在耳机的右声道播放声音?

    我需要仅在耳机的左声道上播放声音 wav 文件 而另一个文件仅在耳机的右声道上播放 我是c 新手 请帮我解决这个问题 我认为仅 WPF 无法做到这一点 但您可能想查看一下NAudio http naudio codeplex com
  • Blazor.net UI 不渲染任何内容

    我正在开发 Blaor Net 应用程序 参考了互联网上的许多帖子 我面临的问题是 我想将代码从 UI 移动到单独的文件 以保持 razor 文件干净 可读和可理解 为此 我将 UI 端 C 代码保存到一个从 BaseComponent 继
  • 使用 OpenCV 洪水填充

    我只是想使用洪水填充 但它失败了 而且我从未使用过它 所以我认为我做错了什么 Mat flooded new Mat Point flood new Point 1 1 floodedmat Mat zeros myMat2 size Cv
  • 将正则表达式应用于子字符串而不使用字符串切片

    我想在较大的字符串中搜索正则表达式匹配从某个位置开始 and 不使用字符串切片 我的背景是我想迭代地搜索字符串以查找各种正则表达式的匹配项 Python 中的一个自然解决方案是跟踪字符串中的当前位置并使用例如 re match regex
  • jquery:检测滚动位置

    我希望在滚动时看到页脚时收到警报 window on mousewheel function if window scrollTop window height gt footer position top alert footer vis
  • T-SQL 是否有用于连接字符串的聚合函数? [复制]

    这个问题在这里已经有答案了 可能的重复 SQL Server 2000中的内爆类型函数 https stackoverflow com questions 534724 implode type function in sql server
  • 将 Whatsapp Markdown 转换为 HTML 标签

    我需要将 Whatsapp markdown 转换为 HTML 标签 Eg Bold to b Bold b Italic to i Italic i 我想使用正则表达式来捕获字符串中的单词 这是链接 包含测试用例 以及我的最佳尝试 htt
  • 为什么loadedmetadata 不能持续触发

    有谁知道为什么loadedmetadata在chrome上不能持续触发 如果您在检查控制台时打开此页面并保持刷新 您将看到只有三分之一会触发 http output jsbin com petefipepa http output jsbi
  • Base64 反序列化期间的空引用异常 (C#)

    我使用以下方法来序列化和反序列化 NET 对象 public static string SerializeToBase64 object data var stream new MemoryStream var formatter new