2010-04-06 2 views
0

У меня есть строго типизированный набор данных с одной таблицей с тремя столбцами. Эти столбцы содержат пользовательские типы.Сильно типизированный столбец DataSet требует специального типа для реализации IXmlSerializable?

DataColumn1 имеет тип Родитель

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, равную null, а 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 = neutral, PublicKeyToken = null 'не реализует интерфейс IXmlSerializable, поэтому не может продолжаться сериализация. "

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

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

ответ

0

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

[Serializable] 
public class Wrapper 
{ 
    [XmlElement(ElementName="Child1", Type=typeof(Child1)), 
    XmlElement(ElementName="Child2", Type=typeof(Child2))] 
    public Parent Value { get; set; } 
} 
Смежные вопросы