BinaryFormatter 序列化和反序列化线程安全吗?

2024-03-24

参考文献this https://stackoverflow.com/questions/129389/how-do-you-do-a-deep-copy-an-object-in-net-c-specifically/129395#129395回答一个问题。

可以将其重写为:

    private static BinaryFormatter formatter = new BinaryFormatter();

    public static T DeepClone<T>(this T a)
    {
        using(MemoryStream stream = new MemoryStream())
        {
            formatter.Serialize(stream, a);
            stream.Position = 0;
            return (T)formatter.Deserialize(stream);
        }
    }

那么避免为每个调用构造(和 GC'ing)一个新的 BinaryFormatter 吗?

该代码路径经常受到攻击,因为它涉及我们的缓存层,我希望使其尽可能轻量级。

Thanks.


根据MSDN http://msdn.microsoft.com/en-us/library/system.runtime.serialization.formatters.binary.binaryformatter.aspx:

任何公共静态(在 Visual 基本)该类型的成员是线程 安全的。任何实例成员都不是 保证线程安全。

因此,您需要同步对序列化/反序列化方法的访问。

您是否通过每次创建本地序列化器实例来识别特定的性能问题?


UPDATE:

我相信 MSDN,因为即使在某些情况下我们可以验证实例成员可能是线程安全的,但这并不意味着在下一个服务包/更新/框架版本中这将继续如此。

使用 Reflector 查看 BinaryFormatter 构造函数:

public BinaryFormatter()
{
    this.m_typeFormat = FormatterTypeStyle.TypesAlways;
    this.m_securityLevel = TypeFilterLevel.Full;
    this.m_surrogates = null;
    this.m_context = new StreamingContext(StreamingContextStates.All);
}

和 StreamingContext 构造函数:

public StreamingContext(StreamingContextStates state, object additional)
{
    this.m_state = state;
    this.m_additionalContext = additional;
}

坦率地说,分配 6 个属性(其中大部分是enums)应该快得令人眼花缭乱。恕我直言,大部分时间都花在序列化/反序列化方法上。

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

BinaryFormatter 序列化和反序列化线程安全吗? 的相关文章

  • 何时使用 =default 使析构函数默认?

    尽管对构造函数使用 default 对我来说很清楚 即强制编译器在其他构造函数存在时创建默认构造函数 但我仍然无法理解这两种类型的析构函数之间的区别 那些使用 default 的 那些没有显式定义并由编译器自动生成的 我唯一想到的是 gro
  • 使用 Enumerable.OfType() 或 LINQ 查找特定类型的所有子控件

    Existed MyControl1 Controls OfType
  • EF Core 通过完全替换断开集合导航属性的更新

    使用 EF Core 5 0 我有一个 SPA 页面 可以加载Group实体及其集合Employee来自 API 的实体 var groupToUpdate await context Groups Include g gt g Emplo
  • 根据 N 个值中最小的一个返回不同的结果

    不确定如何使标题更具描述性 所以我只是从一个例子开始 我使用下面的代码位 它从枚举中选择一个方向 具体取决于四个轴中哪一个与给定方向相比形成最小角度 static Direction VectorToDirection Vector2 di
  • GCC 和 ld 找不到导出的符号...但它们在那里

    我有一个 C 库和一个 C 应用程序 尝试使用从该库导出的函数和类 该库构建良好 应用程序可以编译 但无法链接 我得到的错误遵循以下形式 app source file cpp text 0x2fdb 对 lib namespace Get
  • 找不到 assimp-vc140-mt.dll ASSIMP

    我已经从以下位置下载了 Assimp 项目http assimp sourceforge net main downloads html http assimp sourceforge net main downloads html Ass
  • 时间:2019-03-17 标签:c#ThreadSafeDeepCopy

    我一直在阅读很多其他问题以及大量谷歌搜索 但我一直无法找到明确的解决方案 根据我读过的一些最佳实践 类的静态方法应该创建线程安全的 并且实例成员应该将线程安全留给消费者 我想为该类实现深度复制方法 该类本身还有其他引用类型成员 有没有什么方
  • fprintf() 线程安全吗?

    我正在为野人就餐问题的某些变量编写一个 C 解决方案 现在 我创建线程 每个线程都将 FILE 获取到同一个调试文件 在线程内我正在使用 fprintf 进行一些打印 打印的语句不受任何类型的互斥锁等保护 我没有在调试文件中观察到任何交错行
  • std::forward_as_tuple 将参数传递给 2 个构造函数

    我想传递多个参数以便在函数内构造两个对象 以同样的方式std pair
  • 如何在服务器端按钮点击时关闭当前标签页?

    我尝试在确认后关闭当前选项卡 因此我将以下代码放在确认按钮的末尾 但选项卡没有关闭 string jScript ClientScript RegisterClientScriptBlock this GetType keyClientBl
  • 检查 RoutedEvent 是否有任何处理程序

    我有一个自定义 Button 类 当单击它时 打开特定窗口 它总是执行相同的操作 我添加了一个可以在按钮的 XAML 中分配的 Click 事件 就像常规按钮一样 当它被单击时 我想执行 Click 事件处理程序 如果已分配 否则我想执行默
  • AES 输出是否小于输入?

    我想加密一个字符串并将其嵌入到 URL 中 因此我想确保加密的输出不大于输入 AES 是可行的方法吗 不可能创建任何始终会创建比输入更小的输出的算法 但可以将任何输出反转回输入 如果您允许 不大于输入 那么基本上您只是在谈论同构算法alwa
  • 是否有相当于 Clang/LLVM 的 .spec 文件,在哪里可以找到参考?

    The gcc驱动程序可以配置为使用特定的链接器 特定的选项和其他细节 例如覆盖系统头 specs files 当前 截至撰写本文时 GCC 版本 4 9 0 的手册此处描述了规范文件 https gcc gnu org onlinedoc
  • 新任务中使用的依赖注入服务

    我在需要时使用依赖项注入来访问我的服务 但我现在想要创建一个并发任务 但这会由于依赖项注入对象及其生命周期而导致问题 我读过这篇文章 标题 防止多线程 Link http mehdi me ambient dbcontext in ef6
  • 了解使用 Windows 本机 WPF 客户端进行 ADFS 登录

    我已经阅读了大量有关 ADFS 与 NodeJS Angular 或其他前端 Web 框架集成以及一般流程如何工作的文献 并通过 Auth0 Angular 起始代码构建了概念证明 但我不明白如何这可以与本机 WPF Windows 应用程
  • 使用taskkill停止Windows服务

    我需要帮助来使用 C 终止 Windows 服务 现在要终止该服务 请使用以下选项 从命令 sc queryex ServiceName 发现后PID服务的 taskkill pid 1234 exemple f 为了便于阅读 但如果您明白
  • 更改 Windows Phone 系统托盘颜色

    有没有办法将 Windows Phone 上的系统托盘颜色从黑色更改为白色 我的应用程序有白色背景 所以我希望系统托盘也是白色的 您可以在页面 XAML 中执行此操作
  • C++ Streambuf 方法可以抛出异常吗?

    我正在尝试找到一种方法来获取读取或写入流的字符数 即使存在错误并且读 写结束时间较短 该方法也是可靠的 我正在做这样的事情 return stream rdbuf gt sputn buffer buffer size 但如果streamb
  • 如何在 DropDownList 中保留空格 - ASP.net MVC Razor 视图

    我在视图中通过以下方式绑定我的模型 问题是我的项目文本是格式化文本 单词之间有空格 如下所示 123 First 234 00 123 AnotherItem 234 00 123 Second 234 00 我想保留此项目文本中的空格 即
  • C++0x中disable_if在哪里?

    Boost 两者都有enable if and disable if 但 C 0x 似乎缺少后者 为什么它被排除在外 C 0x 中是否有元编程工具允许我构建disable if按照enable if 哦 我刚刚注意到std enable i

随机推荐

  • Python 浮点除法不精确[重复]

    这个问题在这里已经有答案了 可能的重复 Python float str 浮动怪异 https stackoverflow com questions 1778368 python float str float weirdness Pyt
  • Redis CLI 未通过 Laravel 显示最近存储的密钥

    我正在尝试使用缓存我的结果redis in Laravel通过做这个 result Cache remember orders cache 10 function use orders return orders return result
  • 我有一个 contentEditable="true" 的 div,需要对输入的数字进行着色

    这是我的代码 非常适合为可编辑 div 中的数字着色 但光标将转到 div 的开头 当我按键盘箭头按钮遍历字符串时 以及当我单击 home 和 end 按钮 光标应该按预期移动 jQuery document ready function
  • 具有数据成员语法的零成本属性

    我 重新 发明了这种使用数据成员语法实现零成本属性的方法 我的意思是用户可以写 some struct some member var var some struct some member 并且这些成员访问以零开销重定向到成员函数 虽然初
  • 对话框中标题分隔符的样式

    我想知道如何摆脱 或更改颜色 对话框中的标题分隔符 它是蜂窝设备上显示的对话框标题下方的一条蓝线 我猜这是 SDK 中的相关布局 但由于没有样式属性 我不知道如何设置它的样式 如果我尝试使用 findViewById 则没有 android
  • 使用 HTTPoison 初始化模块属性

    我正在尝试像这样初始化模块属性 response HTTPoison get url ok response Poison decode response body attr response 我以前用一个文件做过这样的事情 externa
  • 转换给定时区的日期/时间 - java

    我想将此 GMT 时间戳转换为 GMT 13 2011 10 06 03 35 05 我尝试了大约 100 种不同的 DateFormat TimeZone Date GregorianCalendar 等组合来尝试完成这个非常基本的任务
  • Android提供的onKey()、OnKeyDown()和dispatchKeyEvent()方法之间的区别?

    Android提供的onKey OnKeyDown 和dispatchKeyEvent 方法有什么区别 我想知道这些都可以在何时何地使用 请对此进行一些说明 追踪源代码5 1 视图类的源码 http grepcode com file re
  • EJB @Schedule 等待方法完成

    我想编写一个每分钟执行一次的后台作业 EJB 3 1 为此 我使用以下注释 Schedule minute 1 hour 工作正常 但是 有时该作业可能需要一分钟以上的时间 在这种情况下 计时器仍然会被触发 从而导致线程问题 如果当前执行未
  • 如何将非常大的 csv 文件导入到现有的 SQL Server 表中?

    我有一个非常大的 csv 文件 其中包含约 500 列 约 350k 行 我试图将其导入到现有的 SQL Server 表中 我努力了BULK INSERT 我得到 Query executed successfully 0 rows af
  • 使用 AWS Cloudformation 跨多个子网自动扩展会引发错误

    我无法创建 Cloudformation 模板来跨 2 个不同的公共子网自动缩放 我不断收到错误消息 创建失败AWS AutoScaling AutoScalingGroup指定子网的可用区和弹性伸缩 组不匹配 我广泛研究了所有不同的模板代
  • R 中的 diff() 函数有什么作用? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 为什么网络浏览器不支持 h2c(不带 TLS 的 HTTP/2)?

    我真的搜索了网络 但我找不到网络浏览器不支持 h2c 没有 TLS 的 http 2 的原因 任何想法 赞赏 稍微澄清一下 http 2 和 https 使用 ALPN 这称为 h2 http 2 与 http 不需要 ALPN 这称为 h
  • 如何隐藏或删除线系列 RadChart 中的零值

    我正在使用Radchart 我想删除显示零值的线系列 是否有任何可能的方法来隐藏或删除显示零的值 请提供任何解决方案或代码 提前致谢 经过两天的努力 我找到了如何隐藏或删除包含零的线系列的解决方案 我有四个线系列 其中第四线系列包含零的 i
  • NHibernate - 无需映射即可连接

    是否可以连接两个类而无需在它们之间指定映射 使用 Criteria API 我必须加入两个类并从两个类中检索数据 但我无法映射它们 我只知道外键SomeID在第一类和主键中ID在第二 如何创建加入他们的标准 不用映射可以吗 请帮助 我真的需
  • ReactDOM.findDOMNode() 现在已弃用,它的替代方案是什么?

    我有一个正在使用的旧代码findDOMNode 这是我的代码 其中someComponent1 and Expand已经导入了 在这里我对我编写的代码有些怀疑findDOMNode 工作得很好 但由于它现在已被弃用 我想将其删除 我浏览了很
  • 删除 React Native 中的多个组件

    我知道如何通过更改状态来添加和删除单个组件 但如果您有多个组件需要删除 这种方法就行不通了 例如 假设我有 3 个视图 当我点击它们时如何删除它们 示例代码 class Example extends Component render re
  • 移动浏览器将以及何时支持 getUserMedia?

    我使用 前沿 HTML5 WebRTC API 编写了一个 Web 应用程序 请参阅下面的代码 这适用于 Chrome v20 启用了 MediaStream 标志 和最新的 FF Nightly 版本 17 0a1 创建了 media n
  • 如何判断给定的 git 标签是带注释的还是轻量级的?

    I type git tag它列出了我当前的标签 1 2 3 1 2 4 我如何确定其中哪些是带注释的 哪些是轻量级的 git for each ref https git scm com docs git for each ref告诉你每
  • BinaryFormatter 序列化和反序列化线程安全吗?

    参考文献this https stackoverflow com questions 129389 how do you do a deep copy an object in net c specifically 129395 12939