代码之家  ›  专栏  ›  技术社区  ›  leandrosa81

序列化专用列表<>

  •  2
  • leandrosa81  · 技术社区  · 17 年前

    我有一个专门的类,businessobjectlist,带有以下声明:

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

    我想序列化这个类的对象,比如:

    info.AddValue("myList", myList);
    

    我试图添加接口ISerializable,但没有成功。

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

    未序列化时,列表始终为空。 我认为list<gt;对象是可序列化的,但是它们的子类呢?

    编辑:

    仅供将来参考,以下是整个类:

    businessobjectlist.cs(当您调用save()时,它会自动在db all inserts和removes中保持,并将所有修改后的值保存在业务对象上):

    [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
    }
    

    和businessobject.cs:

    [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
    }
    
    1 回复  |  直到 17 年前
        1
  •  4
  •   SLaks    17 年前

    System.Collections.ObjectModel.Collection<T> List<BusinessObject> Collection<T> IList<T> T BusinessObject

    here