2013-03-27 50 views
2

假设我有对象ViewState的 - 适当的方式存储在数据库数据

List<MyClass> collection = new List<MyClass>(); 

以及这些对象将被插入

Dictionary<string, List<MyClass>> sections = new Dictionary<string, List<MyClass>>(); 
// example of insertion 
sections["A"].Add(collection[2]); 

列表和字典存储在ViewState字典的集合。在需要时,将字典中的对象的标识符存储起来并将它们与对象绑定在一起时,它会更符合内存吗?

Dictionary<string, List<int>> sections = new Dictionary<string, List<int>>(); 
// example of insertion 
sections["A"].Add(collection[2].ID); 

据我所知,没有性能提升,因为在第一种情况下,字典将包含大小为32/64位的引用。这是真的吗?

EDIT

MyClass是一类,而不是一个结构。 列表和字典的声明如下:

private List<MyClass> A 
{ 
    get 
    { 
     if (ViewState["a"] == null) 
     { 
      ViewState["a"] = // retrieve data from db 
     } 
     return (List<MyClass>)ViewState["a"]; 
    } 
    set 
    { 
     ViewState["a"] = value; 
    } 
} 

private Dictionary<string, List<MyClass>> B 
{ 
    get 
    { 
     if (ViewState["b"] == null) 
     { 
      ViewState["b"] = new Dictionary<string, List<MyClass>>(); 
     } 
     return (Dictionary<string, List<MyClass>>)ViewState["b"]; 
    } 
    set 
    { 
     ViewState["b"] = value; 
    } 
} 
+0

是的,如果'MyClass'是'class',而不是'struct' – 2013-03-27 14:49:42

+0

你在哪里保留你的对象?在您的页面发送给客户端后,它们将被销毁,因此即使您在视图状态中保留对它们的引用,它们也不会指向您回程中的任何有效内容。所以,你很可能需要将它们保持在会话中,并且一旦你将它们放在会话中,就没有必要在视图状态中有任何内容引用它们。 – AaronS 2013-03-27 14:56:34

+0

修改我的帖子。 – ChruS 2013-03-27 15:08:09

回答

0

会不会是更多的内存友好的存储对象的标识符在 字典和使用对象将它们绑定后,当我需要他们?

如果“记忆型”你的意思是“小视图状态”,因此较小的页面大小,更快的渲染,更高效的浏览器操作...

是,存储复杂类型只有ID将导致比序列化整个对象图小的ViewState字符串。这是好事,你正在考虑这个,而不是盲目地把事情放入ViewState(一个常见的错误)。

两件事情:

  • ViewState中也不能幸免于被篡改,因此攻击者可以尝试提交对象的ID,以他们没有获得。您可以使用EnableViewStateMac作为威慑。我仍然会手动验证关键ID以确保用户有权访问它们。

  • 如果您经常使用这些对象,您可能会更好地将它们存储在SessionCache中,而不是多次调用数据库。

+0

是的,我的意思就是这个。感谢您的详细解答。 – ChruS 2013-03-28 09:34:47

相关问题