Getting an invalidoperationexception when deserialising XML

Posted by Paul Johnson on Stack Overflow See other posts from Stack Overflow or by Paul Johnson
Published on 2010-05-24T13:48:20Z Indexed on 2010/05/24 13:51 UTC
Read the original article Hit count: 323

Filed under:
|

Hi,

I'm writing a simple proof of concept application to load up an XML file and depending on the very simple code, create a window and put something into it (it's for a much larger project). Due to limitations in Mono, I'm having to run in this way.

The code I currently have looks like this

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Windows.Forms;
using System.IO;
using System.Collections;
using System.Xml;
using System.Xml.Serialization;

namespace form_from_xml 
{
    public class xmlhandler : Form
    {
        public void loaddesign()
        {
            FormData f;
            f = null;
            try
            {
                string path_env = Path.GetDirectoryName(Application.ExecutablePath) + Path.DirectorySeparatorChar;
                // code dies on the line below
                XmlSerializer s = new XmlSerializer(typeof(FormData));
                TextReader r = new StreamReader(path_env + "designer-test.xml");
                f = (FormData)s.Deserialize(r);
                r.Close();
            }
            catch (System.IO.FileNotFoundException)
            {
                MessageBox.Show("Unable to find the form file", "File not found", MessageBoxButtons.OK);
            }
        }
    }

    [XmlRoot("Forms")]
    public class FormData
    {
        private ArrayList formData;

        public FormData()
        {
            formData = new ArrayList();
        }


        [XmlElement("Element")]
        public Elements[] elements
        {
            get
            {
                Elements[] elements = new Elements[formData.Count];
                formData.CopyTo(elements);
                return elements;
            }
            set
            {
                if (value == null)
                    return;
                Elements[] elements = (Elements[])value;
                formData.Clear();
                foreach (Elements element in elements)
                    formData.Add(element);
            }
        }       

        public int AddItem(Elements element)
        {
            return formData.Add(element);
        }
    }

    public class Elements
    {
        [XmlAttribute("formname")]
        public string name;
        [XmlAttribute("winxsize")]
        public int winxs;
        [XmlAttribute("winysize")]
        public int winys;
        [XmlAttribute("type")]
        public object type;
        [XmlAttribute("xpos")]
        public int xpos;
        [XmlAttribute("ypos")]
        public int ypos;
        [XmlAttribute("externaldata")]
        public bool external;
        [XmlAttribute("externalplace")]
        public string externalplace;
        [XmlAttribute("text")]
        public string text;
        [XmlAttribute("questions")]
        public bool questions;
        [XmlAttribute("questiontype")]
        public object qtype;
        [XmlAttribute("numberqs")]
        public int numberqs;
        [XmlAttribute("answerfile")]
        public string ansfile;
        [XmlAttribute("backlink")]
        public int backlink;
        [XmlAttribute("forwardlink")]
        public int forwardlink;

        public Elements()
        {
        }

        public Elements(string fn, int wx, int wy, object t, int x, int y, bool ext, string extpl, string te, bool q, 
            object qt, int num, string ans, int back, int end)
        {
            name = fn;
            winxs = wx;
            winys = wy;
            type = t;
            xpos = x;
            ypos = y;
            external = ext;
            externalplace = extpl;
            text = te;
            questions = q;
            qtype = qt;
            numberqs = num;
            ansfile = ans;
            backlink = back;
            forwardlink = end;
        }
    }
}

With a very simple xmlhandler xml = new xmlhander(); xml.loaddesign(); attached to a winform button.

Everything is in the same namespace and the xml file actually exists.

This is annoying me now - can anyone spot the error of my ways?

Paul

© Stack Overflow or respective owner

Related posts about c#

Related posts about xml-serialization