这是我的代码:
[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();
}
}
答案 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无法序列化。但是,数据集可以,因此您必须将数据表放在数据集中,然后才能将其序列化。