Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

  1. #1
    Membre émérite
    Erreur compilation fichier xml sur chargement d'une list via content
    Bonjour,

    je cherche à m'amuser avec les content de XNA.
    Je souhaite manipuler des fichiers XML décrivant des discussions.

    ma classe Discussion :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    public class Discussion
        {
            private List<Dialogue> dialogues = new List<Dialogue>();
            private String idDiscussion = null;
            private String idInitiateurDiscussion = null;
     
            public List<Dialogue> Dialogues
            {
                get { return dialogues; }
                set { dialogues = value; }
            }
     
            public String IdInitiateurDiscussion
            {
                get { return idInitiateurDiscussion; }
                set { idInitiateurDiscussion = value; }
            }
     
            public String IdDiscussion
            {
                get { return idDiscussion; }
                set { idDiscussion = value; }
            }
    ...
    }


    ma classe Dialogue qui compose Discussion :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
        public class Dialogue
        {
            private String idDialogue = null;
            private String texteEnonce = null;
            private String idParleur = null;
            private String idDialogueParent = null;
     
            public String TexteEnonce
            {
                get { return texteEnonce; }
                set { texteEnonce = value; }
            }
     
            public String IdDialogueParent
            {
                get { return idDialogueParent; }
                set { idDialogueParent = value; }
            }
     
            public String IdParleur
            {
                get { return idParleur; }
                set { idParleur = value; }
            }
     
            public String IdDialogue
            {
                get { return idDialogue; }
                set { idDialogue = value; }
            }
    ...
    }


    Mon Reader:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
        public class DiscussionContentReader : ContentTypeReader<Discussion>
        {
            protected override Discussion Read(ContentReader input, Discussion existingInstance)
            {
                Discussion dis = new Discussion();
     
                dis.IdDiscussion = input.ReadString();
                dis.IdInitiateurDiscussion = input.ReadString();
                dis.Dialogues = input.ReadObject<List<Dialogue>>();
     
                return dis;
            }
        }
     
     
        public class DialogueContentReader : ContentTypeReader<Dialogue>
        {
            protected override Dialogue Read(ContentReader input, Dialogue existingInstance)
            {
                Dialogue d = new Dialogue();
     
                d.IdDialogue = input.ReadString();
                d.IdDialogueParent = input.ReadString();
                d.TexteEnonce = input.ReadString();
                d.IdParleur = input.ReadString();
     
                return d;
            }
        }


    Mon Writer:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
        [ContentTypeWriter]
        public class DiscussionContentWriter : ContentTypeWriter<Discussion>
        {
            protected override void Write(ContentWriter output, Discussion value)
            {
                output.Write(value.IdDiscussion);
                output.Write(value.IdInitiateurDiscussion);
                output.WriteObject<List<Dialogue>>(value.Dialogues);
            }
     
            public override string GetRuntimeReader(TargetPlatform targetPlatform)
            {
                return typeof(DiscussionContentReader).AssemblyQualifiedName;
            }
        }
     
        [ContentTypeWriter]
        public class DialogueContentWriter : ContentTypeWriter<Dialogue>
        {
            protected override void Write(ContentWriter output, Dialogue value)
            {
                output.Write(value.IdDialogue);
                output.Write(value.IdDialogueParent);
                output.Write(value.TexteEnonce);
                output.Write(value.IdParleur);
            }
     
            public override string GetRuntimeReader(TargetPlatform targetPlatform)
            {
                return typeof(DialogueContentWriter).AssemblyQualifiedName;
            }
        }


    XML créé à la mano:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    <?xml version="1.0" encoding="utf-8" ?>
    <XnaContent>
      <Asset Type="GestionMap.Discussion">
    	  <IdDiscussion>Dis1</IdDiscussion>
    	  <IdInitiateurDiscussion>hyppo</IdInitiateurDiscussion>
    	  <Dialogues Type="System.Collections.Generic.List[GestionMap.Dialogue]">
    		  <Item>
    			  <IdDialogue>dial1</IdDialogue>
    			  <IdDialogueParent />
    			  <TexteEnonce>Bonjour!</TexteEnonce>
    			  <IdParleur>hyppo</IdParleur>
    		  </Item>
    		  <Item>
    			  <IdDialogue>dial2</IdDialogue>
    			  <IdDialogueParent>dial1</IdDialogueParent>
    			  <TexteEnonce>Hé les gars, regardez ce que j'ai trouvé</TexteEnonce>
    			  <IdParleur>explo1</IdParleur>
    		  </Item>
    	  </Dialogues>
      </Asset>
    </XnaContent>


    Mon erreur:
    Erreur XML element "Dialogues" not found in DiscussionDebut.xml
    Je ne comprends pas pourquoi je me fais jeter, pouvez-vous m'aider ? Ai-je tort d'essayer de définir un élément comme liste qu'i n'est pas l'élément racine ?

    Merci

  2. #2
    Membre averti
    Essaye de remplacer :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
     
    <Dialogues Type="System.Collections.Generic.List[GestionMap.Dialogue]">


    par :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
     
    <Asset Type="System.Collections.Generic.List[GestionMap.Dialogue]">


    Sinon tu peux toujours créer un objet Discussion puis Dialogue et essayer de les écrire dans un fichier XML avec ton Writer. Tu verras de suite si c'est ton fichier XML qui déconne

  3. #3
    Membre émérite
    Je vais tenter la solution B, j'aimerais bien garder les propriétés de Discussion

    Merci pour la réponse, je teste ça demain

  4. #4
    Membre émérite
    Finalement je n'ai pas tenu.

    Avec un petit jeu de test :

    Résultat de l'écriture dans le fichier XML:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    <?xml version="1.0" encoding="utf-8"?>
    <XnaContent>
      <Asset Type="GestionMap.Discussion">
        <Dialogues>
          <Item>
            <TexteEnonce>Hello</TexteEnonce>
            <IdDialogueParent Null="true" />
            <IdParleur>Azatoth</IdParleur>
            <IdDialogue>dial1</IdDialogue>
          </Item>
          <Item>
            <TexteEnonce>Bouh</TexteEnonce>
            <IdDialogueParent>dial1</IdDialogueParent>
            <IdParleur>Chercheur</IdParleur>
            <IdDialogue>dial2</IdDialogue>
          </Item>
        </Dialogues>
        <IdInitiateurDiscussion>Azatoth</IdInitiateurDiscussion>
        <IdDiscussion>dis1</IdDiscussion>
      </Asset>
    </XnaContent>


    Le résultat est le même, sauf que l'ordre est différent.

    J'attire l'attention sur le :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    <IdDialogueParent Null="true" />


    Qui me provoque une une exception ArgumentNullException.

    J'ai tenté de tagger la propriété que je pense concernée de cette manière, sans succès :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    [ContentSerializer(AllowNull=true)]
            public String IdDialogueParent
            {
                get { return idDialogueParent; }
                set { idDialogueParent = value; }
            }


    Si on enlève le Null="True", ça compile, mais je ne suis pas sûr de récupérer ma valeur Null à l'exploitation, il va falloir que je teste ça.

    Petit test :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    Discussion d = Content.Load<Discussion>(@"Discussions/Discussion1");


    Exception:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    "Impossible d'effectuer un cast d'un objet de type 'GestionMapExtension.DialogueContentWriter' en type 'Microsoft.Xna.Framework.Content.ContentTypeReader'."


    J'accuse la fatigue donc je m'arrête là pour ce soir, si vous avez des billes pour m'aider ce serait royal.

    Et peut-on m'expliquer pourquoi il est aussi prise de tête sur l'ordre des éléments ?

    Merci

  5. #5
    Membre émérite
    Ai trouvé l'erreur

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public override string GetRuntimeReader(TargetPlatform targetPlatform)
            {
                return typeof(DialogueContentWriter).AssemblyQualifiedName;
            }


    Devient

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public override string GetRuntimeReader(TargetPlatform targetPlatform)
            {
                return typeof(DialogueContentReader).AssemblyQualifiedName;
            }


    Je peine encore à définir des valeurs nulles pour les chaines de caractères, sinon c'est OK. (ah et pourquoi il m'impose son ordre de lecture du xlml ? oO)

    Merci

###raw>template_hook.ano_emploi###