1

J'ai un problème de désérialisation d'une liste de mon fichier xml. Mes propriétés sont internes, donc j'utilise datacontrerserializer pas xmlserializer.Listes DataContractSerializer et Generic

Mon xml est la suivante

<?xml version="1.0" encoding="utf-8" ?> 
<Root xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/Root"> 
    <BackgroundColor> 
     0,0,255 
    </BackgroundColor> 
    <RowGap>1</RowGap> 
    <Table> 
     <TableHeading>"H1"</TableHeading> 
     <StartingColumn>A</StartingColumn> 
    </Table> 
    <Table> 
     <TableHeading>"H2"</TableHeading> 
     <StartingColumn>B</StartingColumn> 
    </Table>  
</Root> 

Racine a Liste du tableau. Le ListOfTables n'est pas désérialisé. Les classes sont

[DataContract()] 
public class Root 
{ 
    [OnDeserialized] 
    internal void OnSerializingMethod(StreamingContext context) 
    { 
     if (Table == null) 
     { 
      Table = new List<TableStructure>(); 
     } 
    } 

    [DataMember(Name = "RowGap")] 
    internal int RowGap { get; set; } 

    [DataMember(Name = "TableHeaderBackgroundColor")] 
    internal string HdrBackColor { get; set; } 

    [DataMember()] 
    internal List<TableStructure> Table { get; set; } 
} 

[DataContract(Name = "Table", Namespace = "")] 
public sealed class TableStructure 
{ 
    [DataMember] 
    public string TableHeading { get; set; } 

    [DataMember] 
    public string StartingColumn { get; set; } 
} 

La méthode desrialize

internal static Root GetSettings() 
{ 
    Root settings; 
    using (FileStream fs = new FileStream("Root.xml", FileMode.Open, FileAccess.Read)) 
    { 
      using (XmlDictionaryReader reader = XmlDictionaryReader.CreateTextReader(fs, new XmlDictionaryReaderQuotas())) 
      { 
       var x = new DataContractSerializer(typeof(Root)); 
       settings = (Root)x.ReadObject(reader); 
       reader.Close(); 
       fs.Close(); 
      } 
    } 
    return settings; 
} 

Cette exécute sans erreur, mais ne se chargent pas toute information de table. RowGap et la couleur est en cours de chargement

Répondre

3

J'ai modifié votre solution pour le faire fonctionner (ajouté les espaces de noms XML aussi):

[DataContract(Namespace = "http://schemas.datacontract.org/2004/07/Root")] 
public class Root 
{ 
    [OnDeserialized] 
    internal void OnSerializingMethod(StreamingContext context) 
    { 
     if (Table == null) 
     { 
      Table = new List<TableStructure>(); 
     } 
    } 

    [DataMember(Name = "RowGap")] 
    internal int RowGap { get; set; } 

    [DataMember(Name = "TableHeaderBackgroundColor")] 
    internal string HdrBackColor { get; set; } 

    [DataMember(Name = "Tables")] 
    internal List<TableStructure> Table { get; set; } 
} 

[DataContract(Name = "Table", Namespace = "http://schemas.datacontract.org/2004/07/Root")] 
public sealed class TableStructure 
{ 
    [DataMember(Name = "StartingColumn")] 
    public string TableHeading { get; set; } 

    [DataMember(Name = "TableHeading")] 
    public string StartingColumn { get; set; } 
} 

fichier XML:

<?xml version="1.0" encoding="utf-8" ?> 
<Root xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/Root"> 
    <BackgroundColor> 
    0,0,255 
    </BackgroundColor> 
    <RowGap>1</RowGap> 
    <!-- Used as container element for list --> 
    <Tables> 
    <Table> 
     <!-- Sorted elements alphabetically --> 
     <StartingColumn>A</StartingColumn> 
     <TableHeading>"H1"</TableHeading> 
    </Table> 
    <Table> 
     <!-- Sorted elements alphabetically --> 
     <StartingColumn>B</StartingColumn> 
     <TableHeading>"H2"</TableHeading> 
    </Table> 
    </Tables> 
</Root> 

note: T L'ordre des éléments XML est pris en compte par le DataContractSerializer comme mentionné ici: http://social.msdn.microsoft.com/Forums/vstudio/en-US/a891928b-d27a-4ef2-83b3-ee407c6b9187/order-of-data-members-in-the-xml-string-influences-deserialization-datacontractserializer?forum=wcf. Comme vous n'avez pas trié les éléments par ordre alphabétique, j'ai modifié le fichier XML pour répondre au comportement du DataContractSerializer.

Vous pouvez spécifier l'ordre des éléments XML à l'aide de l'attribut DataMember et de sa propriété DataMember.Order.

+0

Merci pour votre aide. ça fonctionne maintenant. – MJK

1

Comment avez-vous créé le fichier XML? À la main ou à travers un sérialiseur? Il doit y avoir un élément <Table> supplémentaire (représentant la propriété Root.Table) entourant les éléments <Table> existants (représentant chaque instance TableStructure).

Ce xml (créé par DataContractSerializer) désérialise comme prévu sur ma machine:

<Root xmlns="http://schemas.datacontract.org/2004/07/TestDataGrid" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
    <RowGap>101</RowGap> 
    <Table> 
     <Table xmlns=""> 
      <StartingColumn>1</StartingColumn> 
      <TableHeading>First</TableHeading> 
     </Table> 
     <Table xmlns=""> 
      <StartingColumn>2</StartingColumn> 
      <TableHeading>Second</TableHeading> 
     </Table> 
    </Table> 
    <TableHeaderBackgroundColor>c0ffee</TableHeaderBackgroundColor> 
</Root> 
+1

l'élément Table d'origine n'a pas d'attribut xmlns, que se passe-t-il lorsque vous supprimez l'attribut et que vous le désérialisez? –

+0

Si vous supprimez les attributs 'xmlns' vides du xml que j'ai posté, les' Table's ne seront pas désérialisés. Ils sont en quelque sorte nécessaires pour dire au désérialisateur que la classe réside dans un espace de noms différent de celui de 'Root'. Si vous marquez la classe 'Root' avec l'espace de nom _same_ cependant (' [DataContract (Namespace = "")] '), vous n'obtenez plus ces attributs xmlns dans le xml. – Sphinxxx

+0

alors vous devriez mentionner vos changements dans la réponse –