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

Nis*_*mar 5 asp.net viewstate

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

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

Dar*_*rov 9

ViewState使用ObjectStateFormatter使用二进制序列化序列化.从文档中引用:

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 ,

此外,虽然传统的字符串类型和字符串数组是在未经改变的情况下写入序列化二进制写入器的,但是通过创建内部字符串表来优化某些字符串.如果字符串具有关联的TypeConverter对象,或者字符串实际上是IndexedString类的实例,则使用这些表优化字符串.

上面未列出的其他类型是使用BinaryFormatter对象进行二进制序列化的,如果它们实现了ISerializable接口或者使用SerializableAttribute属性进行了修饰.ObjectStateFormatter类未针对任何这些可序列化类型进行优化.

如果ObjectStateFormatter类遇到不可序列化的类型,则抛出ArgumentException异常.

对于要进行二进制序列化的对象,ViewState需要使用该[Serializable]属性进行修饰.因此,您可以放入ViewState具有此属性的任何对象.需要注意的是简单的类型,如字符串,整数,浮点,...也可以放入ViewState.