У меня есть 2 класс:Casting XML унаследованного класса
public class ClassA
public class ClassB (from another namespace) : ClassA
У меня есть XML-файлы заправить ClassA
.
Как отличить его от ClassB
при десериализации.
Возможно ли это?
У меня есть 2 класс:Casting XML унаследованного класса
public class ClassA
public class ClassB (from another namespace) : ClassA
У меня есть XML-файлы заправить ClassA
.
Как отличить его от ClassB
при десериализации.
Возможно ли это?
Я попробовал это решение, то есть применил элемент XmlRoot, указав то же имя элемента, что и в ClassA.
Это должно работать:
using System;
using System.IO;
using System.Xml.Serialization;
[XmlRoot("ClassA")]
public class ClassA {
[XmlElement]
public String TextA {
get;
set;
}
}
[XmlRoot("ClassA")] // note that the two are the same
public class ClassB : ClassA {
[XmlElement]
public String TextB {
get;
set;
}
}
class Program {
static void Main(string[] args) {
// create a ClassA object and serialize it
ClassA a = new ClassA();
a.TextA = "some text";
// serialize
XmlSerializer xsa = new XmlSerializer(typeof(ClassA));
StringWriter sw = new StringWriter();
xsa.Serialize(sw, a);
// deserialize to a ClassB object
XmlSerializer xsb = new XmlSerializer(typeof(ClassB));
StringReader sr = new StringReader(sw.GetStringBuilder().ToString());
ClassB b = (ClassB)xsb.Deserialize(sr);
}
}
Вы не можете отличить базовый класс к производному классу - вы можете отнести только производные классы к базовым классам (в одну сторону).
При создании XmlSerialiser вам необходимо сделать это с вашего ClassB
, он будет deserialise как класс, который вы хотите.
Было бы неверно использовать базовый класс как экземпляр производного класса.
Я получаю сообщение об ошибке: Не ожидается элемент ClassA на этой линии: ClassB Ь = (ClassB) xsb.Deserialize (ср); – user278618
Затем вы должны применить атрибут [XmlRoot ("ClassA")] к классу B. Я обновлю код. –
Возможно, вам также понадобится инструкция [XmlInclude()], чтобы сообщить, какие классы могут там появляться. Например (хотя получение типа может немного отличаться в C#, у меня есть только пример VB): [XmlInclude (GetType (ClassB))] –