我有一个专门的类 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/