c# - 序列化专业列表<>

标签 c# generics serialization

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

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

我想序列化此类的对象,例如:

info.AddValue("myList", myList);

我尝试添加接口(interface) ISerialized,但没有成功。

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

反序列化时列表始终为空。 我认为 List<> 对象是可序列化的,但是它们的子类呢?

编辑:

仅供将来引用,这是整个类(class):

BusinessObjectList.cs(当您调用 save() 时,它会自动将所有插入和从列表中删除的操作保留在数据库上,并保存业务对象上的所有修改值):

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

最佳答案

首先,你应该继承自 System.Collections.ObjectModel.Collection<T> ,不是List<BusinessObject> 。最好继承Collection<T>这样您就可以通过覆盖 InsertItem、SetItem 等来控制对列表的所有更改(甚至通过 IList<T> 进行的更改)。从 T 的集合继承可能也更好。比 BusinessObject 的集合以便您从基类继承的方法和索引器使用正确的类型。

为了回答您的问题,.Net 集合类型(包括 Collection<T> )都不是可序列化的。您需要自己序列化和反序列化集合;请参阅here获取说明。

关于c# - 序列化专业列表<>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1506734/

相关文章:

java - Java Comparator.comparing() 类型签名是什么意思?

java - 泛型类型转换

c++ - 如何将哈希表存储在文件中?

c# - 我将如何在 PHP 中生成相同的 token ? (来自.NET)

c# - WP7 silverlight自定义控件使用弹窗

c# - Windows Azure 中的数据库连接

java - 内部类内部静态 : serialVersionUID

c# - 如何使用 Linq 获得最高值(value)

java - 如何使用单个类型参数为泛型类型指定两个具体类型参数?

Java套接字/序列化,对象不会更新