.NET运行时在序列化为SQL会话状态/ InProc会话状态时是否维护对象引用;在序列化/反序列化期间?在下面的示例中,我希望引用指向同一个对象。 有人可以解释为什么情况并非如此。
E.g:
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; }
}
注意:假设list
和bar
对象已经被序列化/持久化为SQL。
答案 0 :(得分:1)
是的,因为它使用BinaryFormatter进行序列化,保留了对象树。详情请见: http://msdn.microsoft.com/en-us/library/aa479041.aspx#aspnetsessionstate_topic5
序列化的一些方法,如XML和Soap,肯定会在反序列化后创建2个不同的对象;但二进制序列化(用于保存SQL中的Asp.Net会话状态的二进制序列化)确实保留了对象树,并且会使示例中的两个引用指向内存中的同一物理对象。