C# 序列化专用列表<&燃气轮机;

C# 序列化专用列表<&燃气轮机;,c#,generics,serialization,C#,Generics,Serialization,我有一个专门的类BusinessObjectList,其中包含以下声明: public class BusinessObjectList<T> : List<BusinessObject> where T: BusinessObject {} 我试图添加接口ISerializable,但没有成功 public class BusinessObjectList<T> : List<BusinessObject>, ISerializable whe

我有一个专门的类BusinessObjectList,其中包含以下声明:

public class BusinessObjectList<T> : List<BusinessObject> where T: BusinessObject {}
我试图添加接口ISerializable,但没有成功

public class BusinessObjectList<T> : List<BusinessObject>, ISerializable where T: BusinessObject {}

首先,您应该从继承,而不是从列表继承。最好是从
集合继承
,这样您就可以通过覆盖InsertItem、SetItem、,等等。从
T
集合继承可能比从
BusinessObject
集合继承要好,这样从基类继承的方法和索引器就可以使用正确的类型


要回答您的问题,没有一种.Net集合类型(包括
集合
)是可序列化的。您需要自己对集合进行序列化和反序列化;有关说明,请参阅。

我个人认为,有很多很好的理由不在这里使用
BinaryFormatter
;特别是如果您打算保存数据,那么基于契约的方法(如
XmlSerializer
)将更加稳定。我需要序列化它,因为我在IIS上的会话存储在SQL Server上,而不是存储在进程中。是否可以使用XMLSerializer实现此目的?谢谢,我已经为所有业务对象进行了序列化,但我认为列表在默认情况下是可序列化的。从现在起,我将从收藏中继承遗产。谢谢
public class BusinessObjectList<T> : List<BusinessObject>, ISerializable where T: BusinessObject {}
[Serializable()]
public class BusinessObjectList<T> : List<BusinessObject>,ISerializable where T: BusinessObject
{
    public delegate void BusinessObjectListDeleteHandler(T objDeleted);
    public event BusinessObjectListDeleteHandler deleteHandler;

    List<BusinessObject> objsForDelete = new List<BusinessObject>();
    public BusinessObjectList()
    {

    }

    public new void Add(BusinessObject item)
    {
        base.Add(item);
    }
    public new T this[int index]
    {
        get
        {                 
            return (T)base[index];
        }
    }

    public bool save()
    {
        foreach (T obj in objsForDelete)
        {
            if (deleteHandler != null)
                deleteHandler(obj);
            obj.delete();
        }
        objsForDelete.Clear();
        foreach (BusinessObject obj in this)
        {
            obj.save();
        }
        return true;
    }

    public new void Clear()
    {
        foreach (BusinessObject obj in this)
        {
            //obj.delete();
            objsForDelete.Add(obj);
        }
        base.Clear();
    }

    public new void Remove(BusinessObject obj)
    {
        // obj.delete();
        objsForDelete.Add(obj);
        base.Remove(obj);
    }

    public new void RemoveAt(int index)
    {
        objsForDelete.Add(this[index]);
        base.RemoveAt(index);
    }


    #region ISerializable Members

    public void GetObjectData(SerializationInfo info, StreamingContext context)
    {
        // should I do something here??
    }

    #endregion
}
[Serializable()]
public abstract class BusinessObject:ISerializable
{
    public abstract bool save();
    public abstract bool delete();
    public abstract DbTransaction startTransaction();
    public abstract void useTransaction(DbTransaction transaction);
    public abstract DbTransaction getTransaction();

    #region ISerializable Members

    public void GetObjectData(SerializationInfo info, StreamingContext context)
    {            
        // nothing to serialize here            
    }

    #endregion
}