当有一个DataTable时,在C#中序列化而不是序列化List?

时间:2010-08-03 17:03:31

标签: c# .net

这是我的代码:

[Serializable()]
public class Project
{
    private List<string> _Kinds = new List<string>();
    public DataTable ExtractedElementsTable;

    public Project()
    {
        ExtractedElementsTable = new DataTable();
        ExtractedElementsTable.TableName = "Output";
    }

    public List<string> Kinds
    {
        get { return _Kinds; }
        set { _Kinds = value; }
    }
}

在向List<string> _Kinds添加一些内容后,我尝试序列化整个Poject,然后反序列化它,_Kinds列表为空。但是如果我注释掉引用ExtractedElementsTable的所有三行,它就可以了。这是我的序列化和反序列化代码(请注意序列化代码中的currentProject.Kinds.Add("hi");行。currentProject只是Project的一个实例。

    private void openButton_Click(object sender, EventArgs e)
    {
        if (openFileDialog1.ShowDialog() == DialogResult.OK)
        {
            Stream stream = File.Open(openFileDialog1.FileName, FileMode.Open);
            XmlSerializer xmlFormatter = new XmlSerializer(currentProject.GetType());
            currentProject = (Project)xmlFormatter.Deserialize(stream);
            stream.Close();
        }
    }

    private void saveButton_Click(object sender, EventArgs e)
    {
        if (saveFileDialog1.ShowDialog() == DialogResult.OK)
        {
            currentProject.Kinds.Add("hi");
            Stream stream = File.Open(saveFileDialog1.FileName, FileMode.Create);
            XmlSerializer xmlFormatter = new XmlSerializer(currentProject.GetType());
            xmlFormatter.Serialize(stream, currentProject);
            stream.Close();
        }
    }

5 个答案:

答案 0 :(得分:1)

XML序列化不会序列化私有属性和字段。要么_Kind公开并删除getter和setter,要么使用二进制序列化。

答案 1 :(得分:1)

将DataTable字段更改为DataSet字段。

我跑了不少考试。 Kinds属性将序列化所有项目。但是没有正确地反序列化。但是,我将DataTable字段更改为DataSet,一切正常。

答案 2 :(得分:0)

尝试使用此尺寸。我能够使用Project进行有效的序列化和反序列化,如下所示:

[Serializable()]
public class Project
{
    private List<string> _Kinds = new List<string>();

    public Project()
    {
        ExtractedElementsTable = new DataTable();
        ExtractedElementsTable.TableName = "Output";
    }

    public List<string> Kinds
    {
        get { return _Kinds; }
        set { _Kinds = value; }
    }

    [XmlElement("ExtractedElements")]
    public string ExtractedElementsXml
    {
        get
        {
            using (var writer = new StringWriter())
            {
                this.ExtractedElementsTable.WriteXml(writer);
                return writer.ToString();
            }
        }

        set
        {
            using (var reader = new StringReader(value))
            {
                this.ExtractedElementsTable.ReadXml(reader);
            }
        }
    }

    [XmlIgnore]
    public DataTable ExtractedElementsTable { get; set; }
}

答案 3 :(得分:0)

尝试将您的课程装饰为[DataContract],然后使用DataContractJsonSerializer课程进行序列化。

检查this link

答案 4 :(得分:0)

以后参考访问此问题的其他人... DataTables无法序列化。但是,数据集可以,因此您必须将数据表放在数据集中,然后才能将其序列化。