2010-03-01 5 views

ответ

1

Я попробовал это решение, то есть применил элемент 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); 

    } 
} 
+0

Я получаю сообщение об ошибке: Не ожидается элемент ClassA на этой линии: ClassB Ь = (ClassB) xsb.Deserialize (ср); – user278618

+0

Затем вы должны применить атрибут [XmlRoot ("ClassA")] к классу B. Я обновлю код. –

+0

Возможно, вам также понадобится инструкция [XmlInclude()], чтобы сообщить, какие классы могут там появляться. Например (хотя получение типа может немного отличаться в C#, у меня есть только пример VB): [XmlInclude (GetType (ClassB))] –

1

Вы не можете отличить базовый класс к производному классу - вы можете отнести только производные классы к базовым классам (в одну сторону).

0

При создании XmlSerialiser вам необходимо сделать это с вашего ClassB, он будет deserialise как класс, который вы хотите.

Было бы неверно использовать базовый класс как экземпляр производного класса.

Смежные вопросы