C # XMLSerialize абстрактный унаследованный тип - PullRequest
1 голос
/ 30 июля 2011

У меня проблема с сериализацией XML из C #.

Мои занятия:

public abstract class AbstractFeldtyp
{
    private string _name;
    private string _beschreibung;
    public string Name
    {
        get
        {
            return _name;
        }
        set
        {
            _name = value;
        }
    }

    public string Beschreibung
    {
        get
        {
            return _beschreibung;
        }
        set
        {
            _beschreibung = value;
        }
    }
}

public class Feldtyp_A : AbstractFeldtyp {
    public Feldtyp_A() {
        Name = "My name is A";
        Beschreibung = "I'm a A";
    }
}

public class Feldtyp_B : AbstractFeldtyp {
    public Feldtyp_B() {
        Name = "My name is B";
        Beschreibung = "I'm not a A!";
    }
}

public class My_Root {
    private AbstractFeldtyp[] felder;

    public My_Root() {
        Name = "My name is B";
        Beschreibung = "I'm not a A!";
        felder = new AbstractFeldtyp[] { new Feldtyp_A(), new Feldtyp_B()};
    }
}

Теперь я хочу сериализовать «My_Root» в XML-файл.

public class Serializer
{
    private XmlSerializer s;
    private FileStream stream;
    public Serializer()
    {
        /* This is not acceptable! I must be dynamically */
        Type[] t = new Type[]
        {
            typeof(Feldtyp_A),
            typeof(Feldtyp_B)
        };
        /* End */

        s = new XmlSerializer(typeof(My_Root), t);

        AbstractMaschinenTyp m = new MaschineTyp1();
        this.SerializeObject(m);
    }

    public void SerializeObject(object obj)
    {
        stream = new FileStream(@"D:\File.xml", FileMode.Create);
        if(obj != null)
            s.Serialize(stream, obj);
        stream.Close();
    }

    public object DeserializeObject()
    {
        stream = new FileStream(@"D:\File.xml", FileMode.Open);
        object o = s.Deserialize(stream);
        stream.Close();
        return o;
    }

Конечно, это работает. Но я не знаю во время компиляции, какие классы существуют ...

Мне нужен XML-файл, который выглядит следующим образом:

<?xml version="1.0"?>
<My_Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <Felder>
        <Feld>
            <Feldtyp type="Feldtyp_A" />
        </Feld>
        <Feld>
            <Feldtyp type="Feldtyp_B" />
        </Feld>
    </Felder>
</My_Root>

или

<?xml version="1.0"?>
<My_Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <Felder>
        <Feldtyp type="Feldtyp_A" />
        <Feldtyp type="Feldtyp_B" />
    </Felder>
</My_Root>

Мне не нужны свойства из "Feldtyp_AB". Тип достаточно. Спасибо за помощь:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...