对象的序列化和参考等式

时间:2014-04-14 15:09:53

标签: c# sql session serialization deserialization

.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; }
}

注意:假设listbar对象已经被序列化/持久化为SQL。

1 个答案:

答案 0 :(得分:1)

是的,因为它使用BinaryFormatter进行序列化,保留了对象树。详情请见: http://msdn.microsoft.com/en-us/library/aa479041.aspx#aspnetsessionstate_topic5

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