【问题标题】:Serialize Specialized List<>序列化专业列表<>
【发布时间】:2009-10-01 21:56:45
【问题描述】:

我有一个专门的类,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 对象是可序列化的,但是它们的子类呢?

编辑:

仅供参考,以下是整个课程:

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

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

【问题讨论】:

  • 就个人而言,我认为这里有很多充分的理由不使用BinaryFormatter;特别是如果您打算保存数据 - 基于合约的方法(例如 XmlSerializer)会更加稳定。
  • 我需要序列化它,因为我在 IIS 上的会话存储在 SQL Server 上,而不是进程内。是否可以为此目的使用 XMLSerializer?

标签: c# generics serialization


【解决方案1】:

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

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

【讨论】:

  • 谢谢,我已经为我的所有业务对象进行了序列化,但我认为 List 默认情况下是可序列化的。从现在开始,我将从 Collection 继承。谢谢。
猜你喜欢
  • 2016-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多