我想知道为什么我们必须设置serializable属性来保存视图状态中的对象。
此外,我们可以在视图状态中存储哪种类型的对象?
答案 0 :(得分:9)
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浏览器之间的线路发送(并在回发期间返回),因此如果可能,您可能希望保持音量降低。