【发布时间】:2016-05-20 02:06:49
【问题描述】:
我有一个父类 PartNumber 和两个子类 PartNumberChild1 和 PartNumberChild2。在我的主要创建一个 PartNumberContainer 并添加了两个子 1 对象和两个子 2 对象,我想将不同的子类存储在 PartNumberContainer 类的 PartNumber 列表中,并在 XML 中写入和读取 PartNumberContainer。
当我尝试写出 XML 文件时,我得到一个 InvalidOperationException。
[Serializable]
[XmlInclude(typeof(PartNumberChild1))]
[XmlInclude(typeof(PartNumberChild2))]
public class PartNumber
{
private string partNumber = "";
public abstract ClassType;
public PartNumber()
{
}
public PartNumber(string partNod)
{
partNumber = partNo;
}
public string PartNumber
{
get { return partNumber; }
set { partNumber = value; }
}
}
[Serializable]
Public class PartNumberChild1 : PartNumber
{
private string subPartNumber;
private string classType = "Child1";
public PartNumberChild1(string partNo, string subPartNo)
:base(partNo)
{
subPartNumber = subPartNo;
}
public PartNumberChild1()
{
}
public string SubPartNumber
{
get { return subPartNumber; }
set { subPartNumber = value; }
}
public string ClassType
{
get { return classType; }
set { classType = value; }
}
}
[Serializable]
Public class PartNumberChild2 : PartNumber
{
private string subPartNumber;
private string classType = "Child2";
public PartNumberChild1(string partNo, string subPartNo)
:base(partNo)
{
subPartNumber = subPartNo;
}
public PartNumberChild2()
{
}
public string SubPartNumber
{
get { return subPartNumber; }
set { subPartNumber = value; }
}
public string ClassType
{
get { return classType; }
set { classType = value; }
}
}
[Serializable]
public class PartNumberContainer
{
public static string PART_NUMBER_FILENAME_NAME = " Part_Numbers.xml";
private List<PartNumber> partNumbers;
public PartNumberContainer()
{
partNumbers = new List<PartNumber>();
}
public List<PartNumber> PartNumbers
{
get { return partNumbers; }
set { partNumbers = value; }
}
public void AddPartNumber(PartNumber partNo)
{
partNumbers.Add(partNo);
}
public void AddPartNumber(string partNo)
{
partNumbers.Add(new PartNumber(partNo));
}
public void WriteMeToFile()
{
try
{
我在这一行得到错误。
XmlSerializer x = new XmlSerializer(this.GetType());
StreamWriter writer = new StreamWriter(PART_NUMBER_FILENAME_NAME);
writer.Flush();
x.Serialize(writer, this);
writer.Close();
}
catch (IOException)
{
MessageBox.Show("Exception", "Error Message", MessageBoxButton.OK, MessageBoxImage.Warning);
}
}
public static PartNumberContainer ReadMeFromFile()
{
PartNumberContainer fileData = new PartNumberContainer();
object myObj = fileData;
try
{
XMLFileReaderWriter.ReadConfigurationFile(ref myObj, GetConfigurationFileFolderPath(), PART_NUMBER_FILENAME_NAME);
try
{
XmlSerializer x = new XmlSerializer(myObj.GetType());
StreamReader reader = new StreamReader(PART_NUMBER_FILENAME_NAME);
myProperties = x.Deserialize(reader);
}
catch
{
MessageBox.Show("Exception", "Error Message", MessageBoxButton.OK, MessageBoxImage.Warning);
}
fileData = (PartNumberContainer)myObj;
}
catch
{ // Error reading file
MessageBox.Show(err, "Error Message", MessageBoxButton.OK, MessageBoxImage.Warning);
}
return fileData;
}
public MainWindow()
{
public static PartNumberContainer myPartNoContainer = new UUTPartNumberContainer();
myPartNoContainer.AddPartNumber(new PartNumberChild1("onePartNo","OneSubPartNo"));
myPartNoContainer.AddPartNumber(new PartNumberChild1("twoPartNo","twoSubPartNo"));
myPartNoContainer.AddPartNumber(new PartNumberChild2("onePartNo","OneSubPartNo"));
myPartNoContainer.AddPartNumber(new PartNumberChild2("twoPartNo","twoSubPartNo"));
myPartNoContainer.WriteMeToFile();
PartNumberContainer myPartNoContainerRead = PartNumberContainer.ReadMeFromFile();
Foreach(PartNumber partNo in myPartNoContainerRead. PartNumbers)
{
WriteLine(string.format(“The Part No = {0}, The subPartNumber = {1},
the ClassType = {2} “,partNo.PartNumber, partNo. SubPartNumber , partNo. ClassType )
}
【问题讨论】:
-
异常说 what?
-
Sorry "出现错误,反映类型 PartNumberContainer 和内部异常 PartNumberChild1 无法序列化,因为它没有无参数构造函数。
-
我知道类必须有一个无参数的构造函数才能被序列化。由于您包含其他 3 种类型,因此它们可能都需要具有无参数构造函数。值得一试。
-
我怀疑这是由于放错了属性。
[XmlInclude]唯一相关的地方是PartNumber声明。绝对不是在PartNumberContainer中,因为你现在拥有它。此外,[Serializable]不与 XML 序列化 whatsoever 相关。 -
@Ageonix 是的,这也是一个问题。
标签: c# xml serialization streamwriter