2014-04-14 1 views
0

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에 지속을 가정합니다.

+0

어떻게 동일한 참조를 유지할 수 있습니까? 참조는 메모리 조각에 대한 포인터 일 뿐이므로 일단 비 직렬화하면 새로운 조각을 할당하고 그 안에 객체를 넣습니다. – DoctorMick

답변

1

예, 개체 트리를 그대로 유지하는 직렬화에 BinaryFormatter를 사용하기 때문에 가능합니다. 여기에서 세부 사항을보십시오 : http://msdn.microsoft.com/en-us/library/aa479041.aspx#aspnetsessionstate_topic5

XML과 비누와 같은 직렬화의 일부 메소드는 분명히 비 직렬화 후에 2 개의 다른 객체를 생성합니다. 그러나 SQL에서 Asp.Net 세션 상태를 보존하는 데 사용되는 이진 직렬화는 객체 트리를 유지하고 예제 참조에서 두 참조를 메모리의 동일한 실제 객체로 만듭니다.