У меня строго типизированный набор данных с одной таблицей из трех столбцов. Все эти столбцы содержат пользовательские типы.
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)