对象的序列化和引用相等

本文关键字:引用 序列化 对象 | 更新日期: 2023-09-27 17:58:11

在序列化到SQL会话状态/InProc会话状态时,.NET运行时是否维护对象引用;在序列化/反序列化期间?在下面的例子中,我希望引用指向同一个对象<有人能解释为什么不是这样吗>

例如:

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

对象的序列化和引用相等

是的,因为它使用BinaryFormatter进行序列化,从而保持对象树的原样。请在此处查看详细信息:http://msdn.microsoft.com/en-us/library/aa479041.aspx#aspnetsessionstate_topic5

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