【问题标题】:Serializing an Arraylist of an ArrayList序列化 ArrayList 的 Arraylist
【发布时间】:2011-09-05 16:43:42
【问题描述】:

我的应用程序中有一个 DatagridView。我想将 gridview 列序列化为 XML 文件。仅序列化列名很容易,但我也想序列化列索引。

我会这样对列进行序列化:

ArrayList array = new ArrayList();
foreach(DataGridViewColumn column in datagridView1.Columns)
{
    array.Add(column.Name)
}

using (FileStream file = new FileStream("test.xml", FileMode.Create))
{
     SoapFormatter formatter = new SoapFormatter();
     formatter.Serialize(file, array);
}

但我想知道如何也序列化列索引?

提前感谢您的帮助!

【问题讨论】:

  • 你为什么使用 SoapFormatter 进行 XML 序列化而不是 XmlFormatter??
  • 您使用的是什么版本的 .NET?如果您使用的是 .NET 2.0 或更高版本,则根本不应该使用 ArrayList。
  • @John Saunders - 我正在使用 3.5。

标签: c# .net serialization arraylist


【解决方案1】:

使用名称和索引创建一个公共类 ColumnInfo,您可以将其存储到可以序列化的数组列表中。

[Serializable]
public class ColumnInfo
{
    public string Name;
    public int Index;       
}

ArrayList array = new ArrayList();
foreach(DataGridViewColumn column in datagridView1.Columns)
{
    ColumnInfo ci = new ColumnInfo();
    ci.Name = column.Name;
    //ci.Index = column.Index; //decide how to get column index
    array.Add(ci);
}

using (FileStream file = new FileStream("test.xml", FileMode.Create))
{
     SoapFormatter formatter = new SoapFormatter();
     formatter.Serialize(file, array);
}

更新 我个人使用 XmlFormater,例如,我从问题中复制了源示例。谢谢abstishchev

【讨论】:

  • @Gopalakrishnan Subramani - 这可以工作,但是对于反序列化,如何反序列化列名和该列的索引。你有什么想法吗?
  • 你为什么使用 SoapFormatter 进行 XML 序列化而不是 XmlFormatter??
  • 老实说我不知道​​ SoapFormatter.. 由于 OP 已经知道使用 SoapFormatter 进行序列化,所以我使用了相同的示例。
  • @abatishchev - 真的不知道为什么。哪一个更适合我的情况?
  • @Erika:我建议使用 XmlFormatter 输出 XML,使用 BinaryFormatter 输出二进制
【解决方案2】:

有两点需要注意:

  • 由于您不是在创建肥皂消息,因此我建议您使用 BinarySerializerXmlSerializer 进行临时序列化。
  • 您绝对应该更喜欢强类型的List<string>,而不是无类型的ArrayList

话虽如此,我建议反对完全序列化——它对你的目的来说太重了,而且它不是一个很好的长期存储或传输对象的方法(例如,假设你在你的应用程序的 v1.0 中序列化一个类,然后在 v2.0 中反序列化它,各种奇怪的事情都可能发生)。

我推荐以下方法:按索引对列进行排序,然后将它们逐行写入文件。您的列将在您的文件中正确排序:

using(FileStream file = new FileStream("test.xml", FileMode.Create))
{   
    var columnNames =
        dataGridView1.Columns
        .Cast<DataGridViewColumn>()
        .OrderBy(x => x.ColumnIndex)
        .Select(x => x.Name);

    foreach(string column in columnNames)
        file.WriteLine(column);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-08
    • 2019-09-09
    • 1970-01-01
    • 2013-05-07
    • 2012-02-05
    • 1970-01-01
    • 2013-02-20
    • 2013-10-22
    相关资源
    最近更新 更多