BinaryFormatter的序列化和反序列化是线程安全的吗?引用这个问题的答案。可以重写为:privatestaticBinaryFormatterformatter=newBinaryFormatter();publicstaticTDeepClone(thisTa){using(MemoryStreamstream=newMemoryStream()){formatter.Serialize(stream,a);stream.Position=0;返回(T)格式化程序。反序列化(流);所以避免为每次调用构造(和GC)一个新的BinaryFormatter?这个代码路径非常频繁,因为它涉及到我们的缓存层,我希望尽可能轻量级。谢谢。根据MSDN:此类型的任何公共静态(在VisualBasic中共享)成员都是线程安全的。没有实例成员保证是线程安全的。因此,您需要同步对Serialize/Deserialize方法的访问。您是否每次都通过创建本地序列化程序实例来识别特定的性能问题?更新:我相信MSDN,因为即使我们可以验证实例成员在某些情况下可能是线程安全的,但这并不意味着下一个服务包/更新/框架版本将继续如此。在BinaryFormatter构造函数中使用Reflector查找:publicBinaryFormatter(){this.m_typeFormat=FormatterTypeStyle.TypesAlways;this.m_securityLevel=TypeFilterLevel.Full;this.m_surrogates=null;this.m_context=newStreamingContext(StreamingContextStates.All);}和StreamingContext构造函数:publicStreamingContext(StreamingContextStatesstate,objectadditional){this.m_state=state;this.m_additionalContext=额外的;坦率地说,分配6个属性(主要是枚举)应该非常快。恕我直言,大部分时间都花在序列化/反序列化方法上。您可以使用[ThreadStatic]属性并在值为null时进行初始化。假设您重用线程,这将起作用。[ThreadStatic]privatestaticBinaryFormatter格式化程序=null;publicstaticTDeepClone(thisTa){if(formatter==null)formatter=newBinaryFormatter();使用(MemoryStreamstream=newMemoryStream()){formatter.Serialize(stream,a);stream.Position=0;返回(T)格式化程序。反序列化(流);当然,另一种选择是使用RedGate的Relfector.Net并查看二进制格式化程序实现。阅读代码后,您应该能够确定跨线程使用是否安全;然而,Darling是正确的,因为它可能会在未来的版本中崩溃。以上是C#学习教程:BinaryFormatter序列化和反序列化线程安全吗?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
