CookieContainer类是Serializable.既然你说你需要序列化它,为什么不只是使用BinaryFormatter将它序列化为MemorySteam然后反序列化它来制作副本?
我知道这太简单了,所以请忽略它是否有用.
private CookieContainer CopyContainer(CookieContainer container)
{
using(MemoryStream stream = new MemoryStream())
{
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(stream, container);
stream.Seek(0, SeekOrigin.Begin);
return (CookieContainer)formatter.Deserialize(stream);
}
}
Run Code Online (Sandbox Code Playgroud)
看一看CookieContainter类,您会发现当 cookie 集合发生变化时会发生并发场景,对吗?
您会注意到 CookieContainer 的作者负责使用lock {}
和SyncRoot
处理代码中这些更改集合的部分,我认为这种方法不是针对并发场景的。
此外,您可以注意到任何添加的Cookie都是按字面意思克隆的,因此容器内的 cookie 和所做的所有操作都不会与 cookie 容器外的对象引用混淆。在最坏的情况下,我遗漏了一些东西,如果使用其他帖子中描述的反射方法(我个人不会考虑这是一个 hack,因为它符合要求并且它是受管理的、合法和安全的代码 :))。
事实上,整个 MSDN 文档都提到“不保证任何实例成员都是线程安全的”。- 这是一种提醒,因为你是对的,你真的需要小心。然后通过这样的声明,您基本上可以假设两件事:1)非静态成员根本不安全。2) 一些成员可以是线程安全的,但它们没有正确记录。
归档时间: |
|
查看次数: |
3467 次 |
最近记录: |