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

C# 如何序列化派生数据集的集合,c#,serialization,collections,dataset,C#,Serialization,Collections,Dataset,我是序列化新手,所以我很可能遗漏了一些明显的东西 我有一个名为ResultCollection的类,它是一个四维数据结构——一个从DataSet类派生的对象集合。每个修改后的数据集都包含从DataTable派生的对象的集合。相关代码位为: [Serializable] public class ResultsCollection : CollectionBase, ISerializable { // indexer public MyDataSet this[int index] {

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

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

[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接口,如下所示:

// 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);
}

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

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

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

如果您是序列化新手,您可能需要研究。我发现它比[Serialization]属性更容易使用。我认为只使用
[Serializable]
更容易。您必须确保每个类都与序列化类有关系,并将其标记为
[Serializable]
。就个人而言,我更喜欢XML序列化而不是二进制。我发现它非常容易使用,并且能够在事后查看原始数据可以让您知道它是否有问题。尽管如此,我承认有时候这是一条错误的道路。不过我还是喜欢=D@LKIM--谢谢你的建议。如果我在“常规代码”中找不到解决方案,我会尝试一下@我试过了,但也没用。我忘了错误是什么,但我可以找出这是否有用。