很(hěn)簡單的東西,因為(wèi)在學習中遇到了,所以記錄下來(lái).
事情的起因是,我在做一個(gè)購物藍(lán)時(shí),将一個(gè)自定義的類CartManager整個(gè)放進Session中,它的部分代碼如下,其實就是有(yǒu)一個(gè)Private的ArrayList成員_cart用來(lái)放CartInfo類實例,而CartInfo類又包括一個(gè)成員ProductInfo _product和(hé)一個(gè)double _moneny...并不複雜.但(dàn)是我都沒有(yǒu)弄任何Serializable的東西,于是...
本機調試沒問題,放到服務器上(shàng)卻發現這個(gè)購物車(chē)表現非常怪異,時(shí)好時(shí)壞,總覺得(de)好象Session裏的東西亂得(de)很(hěn),有(yǒu)時(shí)能存進去有(yǒu)時(shí)存不進?
比較了本機與服務器的環境,我知道(dào)問題肯定與SessionState有(yǒu)關.因為(wèi)服務器用了Web Farm(并且将最大工作進程數(shù)設置成了10).
一般我們在做一個(gè)WEB Application的時(shí)候,它的SessionState的Mode=InProc的,可(kě)參見web.config文件中的配置
<sessionState
mode="InProc"
stateConnectionString="tcpip=127.0.0.1:42424"
sqlConnectionString="data source=127.0.0.1;Trusted_Connection=yes"
cookieless="false"
timeout="20"
/>
在服務器上(shàng),因為(wèi)存在多(duō)個(gè)工作進程,所以需要将它的寫法改成 mode=StateServer了,否則就會造成前面所說的Session中的值不确定的現象.但(dàn)是,如果簡單地這樣改一下,系統又報錯說對于以StateServer 或者 SqlServer兩種方式保存會話(huà)狀态,要求對象是可(kě)序列化的(大意如此)...所以我們還(hái)需要再将對象做一下可(kě)序列化聲明(míng).
如果要保存的對象很(hěn)簡單,都是由基本類型組成的,就隻需要聲明(míng)一下屬性即可(kě),如:
[Serializable()]
public class ProductInfo {
private string f_SysID;
public string SysID {
get {
return this.f_SysID;
}
set {
this.f_SysID = value;
}
}
對于本例中,CartInfo 與 ProductInfo兩個(gè)類,可(kě)以這樣聲明(míng)一下.隻是CartManager就稍多(duō)幾句話(huà),如下:
[Serializable]
public class CartManager : ISerializable
{
private ArrayList _cart=new ArrayList();
public CartManager()
{
}
protected CartManager(SerializationInfo info, StreamingContext context)
{
this._cart=(ArrayList)info.Getvalue("_cart",typeof(ArrayList));
}
void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context)
{
info.Addvalue("_cart",this._cart);
}
private CartInfo findCartInfo(string sid)
{
foreach(CartInfo ci in this._cart)
{
if( ci.Product.SysID.Equals(sid) ) return ci;
}
return null;
}
public ArrayList getCart()
{
return this._cart;
}
這樣實現了整個(gè)CartManager--CartInfo--ProductInfo的可(kě)序列化聲明(míng),于是就一切正常了...
文章出自:
http://www.cnblogs.com/sharetop/archive/2005/10/08/250286.html