2014-04-14 41 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會話狀態的二進制序列化保留了對象樹,並將使您的示例中的兩個引用都指向內存中的同一物理對象。