Я знаю, что это популярная тема, и я много исследовал, не найдя ответа на мою проблему.Xml десериализован в базовый класс вместо производных классов
У меня есть базовый класс IntroductionAction
и 2 производных класса IntroductionActionComplex
и IntroductionActionSimple
. У меня есть список IntroductionAction
объектов, к которым я добавил объекты обоих производных типов. Мои следующие классы:
[XmlInclude(typeof(IntroductionActionComplex))]
[XmlInclude(typeof(IntroductionActionSimple))]
public class IntroductionAction
{
public IntroductionAction() { }
}
public class IntroductionActionComplex : IntroductionAction
{
[XmlIgnore]
public string name { get; set; }
[XmlElement(ElementName = "QuestionString")]
public string question { get; set; }
[XmlElement(ElementName = "AnswerString")]
public List<string> answerStrings { get; set; }
public IntroductionActionComplex()
{
name = string.Empty;
question = null;
answerStrings = new List<string>();
}
}
public class IntroductionActionSimple : IntroductionAction
{
[XmlIgnore]
public string name { get; set; }
[XmlText]
public string Value { get; set; }
public IntroductionActionSimple()
{
Value = string.Empty;
}
}
Я затем создать список следующим образом
[XmlElement("IntroductionAction")]
public List<IntroductionAction> introductionActions { get; set; }
Я использую XmlSerializer
и все упорядочивает правильно. Это результирующий XML-список, содержащий один из каждого из производных классов, который является правильным.
<IntroductionAction>
<QuestionString>
test
</QuestionString>
<AnswerString>
test
</AnswerString>
<AnswerString>
test
</AnswerString>
</IntroductionAction>
<IntroductionAction>
test
</IntroductionAction>
Этот XML-файл будет на устройство, которое не читает его как XML, а просто ищет теги и делает любую работу, он должен делать и из-за того, что файл не может содержать каких-либо XSI или XSD-теги, отступы и т. Д., Которые обычно связаны с правильным XML.
Моей десериализация код прямо вперед:
public static T Deserialize_xml_Config<T>(string file1, T obj)
{
XmlSerializer deserializer = new XmlSerializer(obj.GetType());
using (TextReader reader = new StreamReader(file1))
{
return (T)deserializer.Deserialize(reader);
}
}
Наконец к моей проблеме. Когда я десериализую, он десериализуется в базовый класс IntroductionAction
, а не в производные классы. Эти классы IntroductionAction
являются частью гораздо более крупного объекта, который я сериализую/десериализую. Я попытался сделать базовый класс абстрактным, так как она не содержит функциональных возможностей, но я получаю сообщение об ошибке на десериализации говоря
Указанный тип аннотация: имя = «IntroductionAction»
Несмотря на мои XmlIncludes это, похоже, не найти производные классы.
Я попытался добавить типы в сериализатор, но это не сработало.
Любая помощь очень ценится.
Edit: Это то, что я имею в виду, добавив типы в сериализатором
XmlSerializer deserializer = new XmlSerializer(obj.GetType(), new Type [] { typeof(IntroductionActionComplex), typeof(IntroductionActionSimple) });
using (TextReader reader = new StreamReader(file1))
{
return (T)deserializer.Deserialize(reader);
}
Кроме того, моя попытка при использовании XmlAttributeOverrides
:
XmlAttributeOverrides attrOverrides = new XmlAttributeOverrides();
var attrs = new XmlAttributes();
XmlElementAttribute attr = new XmlElementAttribute();
attr.ElementName = "IntroductionAction";
attr.Type = typeof(IntroductionActionComplex);
attrs.XmlElements.Add(attr);
attr.ElementName = "IntroductionAction";
attr.Type = typeof(IntroductionActionSimple);
attrs.XmlElements.Add(attr);
attrOverrides.Add(typeof(IntroductionAction), "IntroductionAction", attrs);
XmlSerializer deserializer = new XmlSerializer(obj.GetType(), attrOverrides);
using (TextReader reader = new StreamReader(file1))
{
return (T)deserializer.Deserialize(reader);
}
Добавить выше каждого класса в [XmlRoot (ElementName = "......")] с фактическим именем тега (это верхний/нижний регистр символов) чтобы указать, к какому классу вы хотите включить каждый тег. – jdweng
Можете ли вы опубликовать то, что вы сделали для 'Я попытался добавить типы в сериализатор, но это не сработало'? Я считаю, что вам нужно переопределить атрибуты xml, но я хочу сначала посмотреть, что вы сделали. – SwDevMan81
@jdweng довольно уверен, что это не сработает, потому что оба производных объекта должны быть под тем же именем тега i.e –