我们可以在视图状态中放置哪些类型的对象?

时间:2010-08-27 11:11:11

标签: asp.net viewstate

我想知道为什么我们必须设置serializable属性来保存视图状态中的对象。

此外,我们可以在视图状态中存储哪种类型的对象?

5 个答案:

答案 0 :(得分:9)

使用ObjectStateFormatter使用二进制序列化序列化

ViewState。从文档中引用:

  

ObjectStateFormatter类是   优化以序列化和格式化许多   常见的.NET Framework引用类型,   以及常数。下列   表列出了类型   优化

     

Array,DateTime,Int16,String,ArrayList,   Double,Int32,String [],Boolean,Enum,   null(Nothing),String.Empty,Byte,   Hashtable,Pair,Triplet,Char,   HybridDictionary,Single,Type,Color,   IDictionary,

     

另外,同时   常规字符串类型和字符串   数组是写入和写入的   序列化二进制写入器未改变,   一些字符串通过创建进行优化   内部字符串表。字符串是   如果使用这些表优化   string有一个关联的TypeConverter   对象或字符串实际上是一个   IndexedString类的实例。

     

以上未列出的其他类型   使用a进行二进制序列化   BinaryFormatter对象,如果他们   实现ISerializable接口   或装饰着   SerializableAttribute属性。该   ObjectStateFormatter类不是   优化任何这些   可序列化的类型。

     

如果是ObjectStateFormatter类   遇到一种不是的类型   serializable,一个ArgumentException   抛出异常。

对于ViewState中要二进制序列化的对象,需要使用[Serializable]属性进行修饰。因此,您可以将ViewState任何具有此属性的对象放入其中。请注意,简单类型(如string,int,float,...)也可以放在ViewState

答案 1 :(得分:1)

类型必须可序列化才能放置在ViewState中。 ViewState是一个序列化的对象集合,因此任何可序列化的对象都可以放在那里。

答案 2 :(得分:1)

什么对象 - 根据达伦和安德鲁 - 任何可序列化的对象。 为什么Serializable?这样状态可以像

一样序列化
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUKMTY1NTgzODUwMg9kFgJmD2QWAgIDD2QWAgIBD2QWBgIBDw8WAh4EVGV4dAUXU3VwcGxpZXIgUG9y

但实际上,需要将viewstate保持在最低限度,因为它具有带宽/页面大小性能影响。 控件是viewstate的最常见用户。

答案 3 :(得分:1)

不要在ViewState中放置Guid类型的对象。 ObjectStateFormatter无法识别它们,并且在每个GUID高达130bytes的情况下使用BinaryFormatter时它们会被卡住。最好将它们存储为字符串并在读取时解析它们。但是,这并不总是有效,例如,当使用Guid作为网格中的键时。

此外,在将枚举加载/保存到ViewState时,您可以通过将它们从/转换为整数类型来获得一些收益。在您的控件的属性中,您知道所需的枚举类型,并且不需要在序列化的ViewState中进行编码。

使用Reflector检查ObjectStateFormatter的实现以查看所有内容的处理方式是值得的,这样您就可以了解该过程及其局限性。

答案 4 :(得分:0)

几乎任何可序列化的东西。但是,请记住,数据将通过服务器和Web浏览器之间的线路发送(并在回发期间返回),因此如果可能,您可能希望保持音量降低。