首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何序列化派生数据集的集合

如何序列化派生数据集的集合
EN

Stack Overflow用户
提问于 2012-07-25 03:58:19
回答 1查看 1.1K关注 0票数 0

我是序列化的新手,所以很可能我错过了一些明显的东西!

我有一个名为ResultsCollection的类,它是一个四维数据结构--从DataSet类派生的对象集合。每个修改后的DataSet都包含一个从DataTable派生的对象集合。相关的代码位是:

代码语言:javascript
复制
[Serializable]
public class ResultsCollection : CollectionBase, ISerializable
{
  // indexer
  public MyDataSet this[int index] { get { return (MyDataSet)List[index]; } }
}
[Serializable]
public class MyDataSet : DataSet, ISerializable
{
  // member variable that *overrides* the Tables property of the standard DataSet class
  public new TablesCollection Tables;
}
[Serializable]
public class TablesCollection : CollectionBase, ISerializable
{
  // indexer
  public MyDataTable this[int index] { get { return (MyDataTable)List[index]; } }
}
[Serializable]
public class MyDataTable : DataTable, ISerializable
{
  ...
}

我通过包含一个公共序列化构造函数和一个公共GetObjectData函数实现了ISerializable接口,如下所示:

代码语言:javascript
复制
// ResultsCollection -- serialize all variables and also the inner list itself
public ResultsCollection(SerializationInfo info, StreamingContext ctxt) : base()
{
  _memberVariable = (bool)info.GetValue("_memberVariable", typeof(bool));
  ArrayList innerList = (ArrayList)info.GetValue("List", typeof(ArrayList));
  InnerList.AddRange(innerList);
}
public void GetObjectData(SerializationInfo info, StreamingContext ctxt)
{
  info.AddValue("_memberVariable", _memberVariable);
  info.AddValue("List", InnerList);
}

// MyDataSet -- call standard base-class (DataSet) serialization functions in addition to serializing members
public MyDataSet(SerializationInfo info, StreamingContext ctxt) : base(info, ctxt)
{
  _memberVariable = (bool)info.GetValue("_memberVariable", typeof(bool));
  Tables = (TablesCollection)info.GetValue("Tables", typeof(TablesCollection));
}
public void GetObjectData(SerializationInfo info, StreamingContext ctxt)
{
  base.GetObjectData(info, ctxt);
  info.AddValue("_memberVariable", _memberVariable);
  info.AddValue("Tables", Tables);
}

// TablesCollection -- serialize all variables and also the inner list itself
public TablesCollection(SerializationInfo info, StreamingContext ctxt) : base()
{
  _memberVariable = (bool)info.GetValue("_memberVariable", typeof(bool));
  ArrayList innerList = (ArrayList)info.GetValue("List", typeof(ArrayList));
  InnerList.AddRange(innerList);
}
public void GetObjectData(SerializationInfo info, StreamingContext ctxt)
{
  info.AddValue("_memberVariable", _memberVariable);
  info.AddValue("List", InnerList);
}

// MyDataTable -- call standard base-class (DataTable) serialization functions in addition to serializing members
public MyDataSet(SerializationInfo info, StreamingContext ctxt) : base(info, ctxt)
{
  _memberVariable = (bool)info.GetValue("_memberVariable", typeof(bool));
}
public void GetObjectData(SerializationInfo info, StreamingContext ctxt)
{
  base.GetObjectData(info, ctxt);
  info.AddValue("_memberVariable", _memberVariable);
}

我有一个想要存储在ViewState中的ResultsCollection对象,以便在下一次回发时检索它(这就是所有这些麻烦的原因)。对于最初的请求,似乎一切正常:我已经在序列化函数中设置了断点,并且数据成员确实正在被序列化。然而,在反序列化时,成员变量被正确加载,但是列表对象充满了空成员。当我试图从ResultsCollection中的第一个MyDataSet对象检索DataSetName属性时,代码崩溃了。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-07-27 17:37:04

事实证明,CollectionBase和ISerializable是不兼容的,可能是因为CollectionBase的InnerList属性是只读的。因此,我需要做的是从两个CollectionBase派生类中删除ISerializable定义,即:

代码语言:javascript
复制
[Serializable]
public class ResultsCollection : CollectionBase
{
  // indexer
  public MyDataSet this[int index] { get { return (MyDataSet)List[index]; } }
}
[Serializable]
public class MyDataSet : DataSet, ISerializable
{
  // member variable that *overrides* the Tables property of the standard DataSet class
  public new TablesCollection Tables;
}
[Serializable]
public class TablesCollection : CollectionBase
{
  // indexer
  public MyDataTable this[int index] { get { return (MyDataTable)List[index]; } }
}
[Serializable]
public class MyDataTable : DataTable, ISerializable
{
  ...
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11638399

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档