2014-04-14 43 views
0

.NET运行时是否在序列化到SQL会话状态/ InProc会话状态时维护对象引用;在序列化/反序列化?在下面的例子中,我希望引用指向同一个对象。 有人可以解释为什么事实并非如此。对象序列化和参考平等

例如为:

var list = new List<Foo> { new Foo { Name = "foo" }, new Foo { Name = "bar" } }; 

var bar = list.Single(x => x.Name == "bar"); 

Session["list"] = list; 
Session["bar"] = bar; 

var listDeserialized = (List<Foo>)Session["list"]; 
var barDeserialized = (Foo)Session["bar"]; 

Assert.IsTrue(Object.ReferenceEquals(listDeserialized[1], bar)); // false 

/* class definition */ 
[Serializable] 
public class Foo { 
    public string Name { get; set; } 
} 

注:假设listbar对象已经系列化/保存到SQL。

+0

它怎么可能保持相同的参考?这个引用只是一个指向一段内存的指针,所以一旦你反序列化,它就会分配一块新的内存并把它放入内存中。 – DoctorMick

回答

1

是的,因为它使用BinaryFormatter进行序列化,保持对象树的原样。在这里看到的细节如下: http://msdn.microsoft.com/en-us/library/aa479041.aspx#aspnetsessionstate_topic5

序列化的一些方法,如XML和Soap,在反序列化后肯定会创建两个不同的对象;但是用于在SQL中保留Asp.Net会话状态的二进制序列化保留了对象树,并将使您的示例中的两个引用都指向内存中的同一物理对象。