很簡單的東西,因爲在學(xué)習中遇到了,所以記錄下來.
事(shì)情的起(qǐ)因是,我在做一個購物藍時,將(jiāng)一個自定義的類CartManager整個放進(jìn)Session中,它的部分代碼如下,其實就是有一個Private的ArrayList成(chéng)員_cart用來放CartInfo類實例,而CartInfo類又包括一個成(chéng)員ProductInfo _product和一個double _moneny...并不複雜.但是我都(dōu)沒(méi)有弄任何Serializable的東西,于是...
本機調試沒(méi)問題,放到服務器上卻發(fā)現這(zhè)個購物車表現非常怪異,時好(hǎo)時壞,總覺得好(hǎo)象Session裡(lǐ)的東西亂得很,有時能(néng)存進(jìn)去有時存不進(jìn)?
比較了本機與服務器的環境,我知道(dào)問題肯定與SessionState有關.因爲服務器用了Web Farm(并且將(jiāng)最大工作進(jìn)程數設置成(chéng)了10).
一般我們在做一個WEB Application的時候,它的SessionState的Mode=InProc的,可參見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"
/>
在服務器上,因爲存在多個工作進(jìn)程,所以需要將(jiāng)它的寫法改成(chéng) mode=StateServer了,否則就會(huì)造成(chéng)前面(miàn)所說的Session中的值不确定的現象.但是,如果簡單地這(zhè)樣(yàng)改一下,系統又報錯說對(duì)于以StateServer 或者 SqlServer兩(liǎng)種(zhǒng)方式保存會(huì)話狀态,要求對(duì)象是可序列化的(大意如此)...所以我們還(hái)需要再將(jiāng)對(duì)象做一下可序列化聲明.
如果要保存的對(duì)象很簡單,都(dōu)是由基本類型組成(chéng)的,就隻需要聲明一下屬性即可,如:
[Serializable()]
public class ProductInfo {
private string f_SysID;
public string SysID {
get {
return this.f_SysID;
}
set {
this.f_SysID = value;
}
}
對(duì)于本例中,CartInfo 與 ProductInfo兩(liǎng)個類,可以這(zhè)樣(yàng)聲明一下.隻是CartManager就稍多幾句話,如下:
[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;
}
這(zhè)樣(yàng)實現了整個CartManager--CartInfo--ProductInfo的可序列化聲明,于是就一切正常了...
文章出自:
http://www.cnblogs.com/sharetop/archive/2005/10/08/250286.html