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".
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() { }
} |
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 :
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 :
<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"
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.
Partager