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