Для столбца DataSet со строгим типом данных требуется пользовательский тип для реализации IXmlSerializable? - PullRequest
0 голосов
/ 06 апреля 2010

У меня строго типизированный набор данных с одной таблицей из трех столбцов. Все эти столбцы содержат пользовательские типы.

DataColumn1 имеет тип Parent

DataColumn2 имеет тип Child1

DataColumn3 имеет тип Child2

Вот как выглядят эти классы:

    [Serializable]
[XmlInclude(typeof(Child1)), XmlInclude(typeof(Child2))]
public abstract class Parent
{
    public int p1;
}
[Serializable]
public class Child1 :Parent
{
    public int c1;
}
[Serializable]
public class Child2 : Parent
{
    public int c1;
}

Теперь, если я добавлю строку с DataColumn1 равной нулю, а DataColumns 2 и 3 заполнятся и попытаемся ее сериализовать, это будет работать:

            DataSet1 ds = new DataSet1();
        ds.DataTable1.AddDataTable1Row(null, new Child1(), new Child2());

        StringBuilder sb = new StringBuilder();
        using (StringWriter writer = new StringWriter(sb))
        {
            ds.WriteXml(writer);//Works!
        }

Однако, если я попытаюсь добавить значение в DataColumn1, произойдет сбой:

            DataSet1 ds = new DataSet1();
        ds.DataTable1.AddDataTable1Row(new Child1(), new Child1(), new Child2());

        StringBuilder sb = new StringBuilder();
        using (StringWriter writer = new StringWriter(sb))
        {
            ds.WriteXml(writer);//Fails!
        }

Вот исключение:

"Тип" WindowsFormsApplication4.Child1, WindowsFormsApplication4, Version = 1.0.0.0, Culture = нейтральный, PublicKeyToken = null 'не реализует интерфейс IXmlSerializable, поэтому не может продолжить сериализацию. "

Я также пытался использовать XmlSerializer для сериализации набора данных, но я получаю то же исключение.

Кто-нибудь знает способ обойти это, когда мне не нужно реализовывать IXmlSerializable на всех дочерних классах? В качестве альтернативы, есть ли способ реализовать IXmlSerializable, сохраняя все поведение по умолчанию одинаковым (то есть не имея какого-либо специфичного для класса кода в методах ReadXml и WriteXml)

1 Ответ

0 голосов
/ 07 апреля 2010

Попробуйте использовать класс-обертку вокруг родителя в первом столбце, как это

[Serializable]
public class Wrapper
{
    [XmlElement(ElementName="Child1", Type=typeof(Child1)),
    XmlElement(ElementName="Child2", Type=typeof(Child2))]
    public Parent Value { get; set; }
}
...