【问题标题】:When I run I get an InvalidOperationException when I try to write out the XML file当我尝试写出 XML 文件时,我得到一个 InvalidOperationException
【发布时间】: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


【解决方案1】:

我必须做的是让两个子类都公开 -- public class PartNumberChild2 : PartNumber 并且我必须添加构造函数 public PartNumberChild2() { }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-29
    • 2021-12-28
    • 2022-10-04
    相关资源
    最近更新 更多