很簡單的東西,因為(wèi)在學習中遇到了,內文所以記錄下來.
事情的起因是,我在做一個購物藍時(shí),将一個自定義的類CartM多紙anager整個放進Session中,它的部分務快代碼如(rú)下,其實就是有一個Private的ArrayList成員麗行_cart用來放CartInfo類實例,而CartInfo類又樂煙包括一個成員ProductInfo _product和一個doubl雨在e _moneny...并不(bù)複雜.但是我都沒校劇有弄任何Serializable的東西,于是...業頻
本機調試沒問題,放到服務器(qì)上卻發現這個購開土物車(chē)表現非常怪異,時(shí)好(街冷hǎo)時(shí)壞,總覺得(de)好(hǎo)象Session裡的坐風東西亂得(de)很,有時(shí)能存進去有時(shí)存不(bù)進地了?
比較了本機與服務器(qì)的環境,我知道問題肯定白銀與SessionState有關.因為(wèi)服務器工水(qì)用了Web Farm(并且将最大(dà)和分工(gōng)作進程數設置成了10).
一般我們(men)在做一個WEB Application的時(shí)候腦光,它的SessionState的Mode=InProc的,可參見web鐘人.config文件中的配置
<sessionState
mode="InProc"
stateConnectionString=木亮"tcpip=127.0.0.1:42424"
sqlConnectionString="data source=12中離7.0.0.1;Trusted_Conn坐亮ection=yes"
cookieless="false"
timeout="20"
/>
在服務器(qì)上,因為(wèi)存在多個工電員(gōng)作進程,所以需要将它的寫法改成 mo店動de=StateServer了,否則就會(huì)造成前面所說(shuō)的從會Session中的值不(bù)确定的現象.但是,如(rú分朋)果簡單地這樣改一下,系統又報錯(cuò)說(shuō)對于以S到高tateServer 或者 SqlServer兩種方式保存會(huì老火)話狀态,要求對象是可序列化的(大(dà)意如(rú家你)此)...所以我們(men)還需要再将對象見工做一下可序列化聲明.
如(rú)果要保存的對象很簡單,都是由基本類型組成小她的,就隻需要聲明一下屬性即可,如(rú):
[Serializable()]
public class ProductInfo {
private string f_SysI音答D;
public string SysID {
get {
return this.f_SysID;
}
set {
this.f_SysID = value;
}
}
對于本例中,CartInfo 與 ProductIn商計fo兩個類,可以這樣聲明一下.隻是CartMan聽兵ager就稍多幾句話,如(rú)下:
[Serializable]
public class CartMan有自ager : ISerializable
{
private ArrayList _cart=new ArrayList理金();
public CartManager()
{
}
protected CartManager(Serialization睡黑Info info, StreamingConte的哥xt context)
{
this._cart=(ArrayList)info.Getvalue("_cart",typeof(ArrayList算秒));
}
void ISerializable.GetObjectData(Seria秒在lizationInfo info, StreamingContext co線國ntext)
{
info.Addvalue("_cart",this._cart);
}
private CartInfo findCartI家白nfo(string sid)
{
foreach(CartInfo ci in th些近is._cart)
{
if( ci.Product.SysID.Equals(是男sid) ) return ci;
}
return null;
}
public ArrayList getCart()
{
return this._cart;
}
這樣實現了整個CartManager--CartInfo--Produc件醫tInfo的可序列化聲明,于是就一切正常了...
文章出自:
http://www.cnblogs.com/sha鄉厭retop/archive/2005/10/08船舊/250286.html