ASP.Net中用ViewState存储自定义复杂对象后类型转换的一个问题

举个例子吧,我是在使用DataSet和DataTable时发现的问题,所以就以此举例,其他类型没试过,不过应该是一样的

public   class   myData : DataSet
{
       
public myData()
       
{
             
this.Tables.Add( new myDataTable() );
       }

}


public   class  myDataTable : DataTable
{
        
public myDataTable
        
{
              
this.TableName = "MyDataTable";
              
this.Columns.Add( Column1,  typeof(String) );
        }

}

就以上的这种结构,

声明一个myData类的实例myData111,然后使用myData111.Tables["MyDataTable"]从中取出其成员(取出来时应该是DataTable类型的实例),转换为myDataTable类型

即,

myDataTable myDataTable111   =   (myDataTable) myData111.Tables[ " myDataTable " ];

以上这样做,是一个最简单的符合面向对象法则的类型转换,但是如果将当初声明的myData111放入ViewState中,即

ViewState[ " mydata " =  myData111;

当页面回发服务器时,从视图状态中取出对象,进行正常的类型转换,如下

myData  myData111  =  (myData) ViewState[ " mydata " ];
myDataTable myTable111 
=  (myDataTable) myData111.Tables[ " myDataTable " ];

以上两句,第一个转换无疑会成功,但是第二个转换则会失败(根据面向对象的原理也应该成功),这时可以查看myData111.Tables["myDataTable"].Type()已经是DataTable型了,而本应该是myDataTable型。

这种情况在Session和其他内存结构中都没有,只是ViewState中存在,估计是因为ViewState是放在页面中的,直接影响页面的大小,所以对于复杂的对象结构没能完全保留其原貌,也许是一个bug,也许是因为各种原因而无奈的有意为之

以上是在.net1.1环境中,使用VS.net 2003开发环境,Windows server 2003 sp1,IIS6.0等运行环境进行测试的。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值