Возможный дубликат:
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», когда дело касается члена, представляющего мой класс выше.