参考文献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(使用前将#替换为@)