2010-08-27 67 views

回答

9

ViewState使用二进制序列化使用ObjectStateFormatter进行序列化。从文档引用:

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

阵列,日期时间,Int16类型,字符串,ArrayList中, 双人,的Int32,字符串[],布尔型,枚举, 空(没有),的String.Empty,字节, 哈希表,对,三重峰,CHAR, HybridDictionary的,单身,类型,颜色, IDictionary的,

另外,虽然 常规串类型和字符串 阵列被写入并从 串行二进制作家不变, 某些字符串通过创建 内部字符串表优化。如果 字符串具有关联的TypeConverter 对象或者该字符串实际上是IndexedString类的 实例,则使用这些表优化字符串 。

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

如果ObjectStateFormatter类 遇到不是 可串行化的类型,则会抛出ArgumentException 异常。

对于一个对象为二进制在它需要的ViewState序列与[Serializable]属性进行装饰。因此,您可以在ViewState中放入任何具有此属性的对象。请注意,像string,int,float等简单类型也可以放在ViewState中。

1

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

0

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

1

什么对象 - 根据达伦和安德鲁 - 任何可序列化的对象。 为什么要Serializable?因此,国家可以然而在实践中连载像

<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUKMTY1NTgzODUwMg9kFgJmD2QWAgIDD2QWAgIBD2QWBgIBDw8WAh4EVGV4dAUXU3VwcGxpZXIgUG9y 

,需要保持视图状态到最低限度,因为它具有带宽/页面大小的性能影响。 控件是视图状态最常见的用户。

1

不要在ViewState中放置Guid类型的对象。 ObjectStateFormatter无法识别它们,并且在使用BinaryFormatter时每个GUID有大约130个字节时会发生卡住。你最好将它们存储为字符串并在阅读时解析它们。然而,这并不总是有效,例如,当将Guid用作网格中的关键字时。另外,在ViewState中加载/保存枚举时,你可以通过将它们从/转换为整型来获得一些信息。在你的控件属性中,你知道所需的枚举类型,并且不需要在序列化的ViewState中进行编码。

支付使用Reflector来检查ObjectStateFormatter的实现以查看如何处理所有内容,以便您对过程及其局限性有所了解。

相关问题