Bonjour à tous,

Je rencontre actuellement un problème pour sérialiser un objet héritant d'une classe abstraite.

Je dispose d'une classe abstraite nommée "PredicateData", ainsi que de deux classes dérivant de celle-ci : "CompoundPredicateData" et "SimplePredicateData".

Code CompoundPredicateData : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
    [Serializable]
    [XmlRoot("CompoundPredicate")]
    [XmlInclude(typeof(SimplePredicateData))]
    public class CompoundPredicateData : PredicateData
    {
        [XmlAttribute("booleanOperator")]
        [XmlChoiceIdentifier("booleanOperator")]
        public BooleanOperator booleanOperator;
 
        [XmlElement()]
        public List<PredicateData> predicates = new List<PredicateData>();
 
        public CompoundPredicateData() { }
}

Code SimplePredicateData : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
 
    [Serializable]
    [XmlRoot("SimplePredicate")]
    public class SimplePredicateData : PredicateData
    {
        [XmlAttribute("field")]
        public String field { get; set; }
        [XmlAttribute("operateur")]
        public Operator operateur { get; set; }
        [XmlAttribute("value")]
        public String value { get; set; }
 
        public SimplePredicateData(){}

Le résultat que je souhaite obtenir est le suivant :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
 
<?xml version="1.0"?>
<CompoundPredicate xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" booleanOperator="isIn">
  <SimplePredicateData field="test" operateur="lessOrEqual " value="value1" />
  <SimplePredicateData field="test2"  operateur="greaterThan" value="value2" />
</CompoundPredicate>
J'ai fais différents essais, mais hélas infructueux.
En effet, en définissant ma List<PredicateData> en temps que XmlElement, j'obtiens le résultat suivant :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
<predicates xsi:type="SimplePredicateData" field="test" operateur="lessOrEqual" value="value1" />
En définissant la liste comme un XmlArray, avec définition des XmlArrayItems, j'ai les champs que je souhaite, mais encapsuler dans un champ "predicates"
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
 
<predicates>
  <SimplePredicateData field="test" operateur="lessOrEqual " value="value1" />
  <SimplePredicateData field="test2"  operateur="greaterThan" value="value2" />
</predicates>
Quelqu'un aurait-il une idée de comment faire cela ?
Merci d'avance.