XMLDeserialize, произошла ошибка отображения типа

Возможный дубликат:
XmlSerializer - был ошибка, отражающая тип

XmlSerializer ser = new XmlSerializer(typeof(configType));

Произошла ошибка, отражающая тип MyNameSpace.configType.

Я урежу еще configType в надежде найти проблему. Помимо удаления якобы избыточных атрибутов, единственное изменение, которое я внес в него после его создания из xsd.exe, - это замена одного из сгенерированных классов моим собственным, чтобы я мог лучше реализовать сериализацию дополнительных элементов.

Спасибо за подсказки для изучения этого innerException, оно восходит к классу, который я реализовал для IXmlSerializable, который теперь находится в собственном файле и представлен ниже:

using System;
using System.Text;
using System.Xml;
using System.Xml.Serialization;

namespace MyNameSpace
{
    [Serializable(), XmlType(Namespace = "MyNameSpace")] //Naughty xsd.exe!
    public class OpOpts : IXmlSerializable
    {
        void defaultFlags()
        {
            Opt1 = true;
            Opt2 = true;
            Opt5 = false;
        }

        public System.Xml.Schema.XmlSchema GetSchema() { return (null); }
        public void ReadXml(XmlReader reader)
        {
            defaultFlags();
            //            reader.Read();
            while (reader.NodeType != XmlNodeType.EndElement)
            {
                switch (reader.Name)
                {
                    case "Opt1": Opt1 = reader.ReadElementContentAsBoolean();
                        break;
                    case "Opt2": Opt2 = reader.ReadElementContentAsBoolean();
                        break;
                    case "Opt5": Opt5 = reader.ReadElementContentAsBoolean();
                        break;
                    default:
                        throw new Exception("Invalid XML tag " + reader.Name + " found under OpOpts.");
                }
            }
        }
        enum OptionEnum
        {
            Opt1, Opt2, Opt5
        }
        public void WriteXml(XmlWriter writer)
        {
            OpOpts defOpts = new OpOpts();
            if (Opt1 != defOpts.Opt1) writer.WriteElementString("Opt1", Opt1.ToString());
            if (Opt2 != defOpts.Opt2) writer.WriteElementString("Opt2", Opt2.ToString());
            if (Opt5 != defOpts.Opt5) writer.WriteElementString("Opt5", Opt5.ToString());
        }

        public bool Opt1 { get; set; }
        public bool Opt2 { get; set; }
        public bool Opt5 { get; set; }
    }
}

jdehaan написал прекрасную статью Как правильно реализовать IXmlSerializable?. Прочитав его проект кода, я обнаружил, что материал, созданный xsd.exe для моего прото-класса, нарушает класс, который я расширил для реализации IXMLSerializable.

В частности, атрибут [XmlType (Namespace = "MyNameSpace")] вызывает ошибку "отражающее свойство". Когда я удаляю его, я получаю немного больше, содержащий класс передает десериализацию всего остального, но кричит «Недействительный тег XML», когда дело касается члена, представляющего мой класс выше.


person John    schedule 15.09.2011    source источник
comment
Посмотрите на внутреннее исключение, оно должно дать вам больше информации.   -  person Kyle W    schedule 15.09.2011
comment
Посмотрите на внутреннее исключение, оно должно дать вам больше информации о том, что не так. Наиболее частая проблема, которую я вижу, заключается в том, что (де) сериализуемый тип не является общедоступным.   -  person Ryan Stecker    schedule 15.09.2011