RunUO-FR
Vous souhaitez réagir à ce message ? Créez un compte en quelques clics ou connectez-vous pour continuer.
RunUO-FR

Forum de support pour RunUO en français.
 
AccueilAccueil  Dernières imagesDernières images  RechercherRechercher  S'enregistrerS'enregistrer  Connexion  
-21%
Le deal à ne pas rater :
LEGO® Icons 10329 Les Plantes Miniatures, Collection Botanique
39.59 € 49.99 €
Voir le deal

 

 [Réglé]Sérialiser

Aller en bas 
2 participants
AuteurMessage
Gargouille




Messages : 97
Date d'inscription : 02/09/2008

[Réglé]Sérialiser Empty
MessageSujet: [Réglé]Sérialiser   [Réglé]Sérialiser Icon_minipostedLun 22 Sep - 17:15

Va voir le tuto dans la section tuto, et aussi dans mon tuto, il y a une page serialisation.

Le souci dans ton code, c'est que tu n'as pas géré la version.

La dernière fois que ça a été sauvé, la version était à 3, et tu n'avais pas sérialisé Description.

Donc, malgré le code que tu va rajouter, ton serveur ne doit pas tenter de lire quelquechose pour description.

La serialisation s'écrit de façon s&équentielle, et doit impértivement être lue pile poil dans le même ordre. Et ce n'est pas parcequ'une valeur est nulle qu'il faut omettre le reader ou le writer correspondant, sinon tout est décalé.

Donc:

passe la version à 4 dans le sérailaize et met le writer description au début, juste apres la version.

Et dans deserialize, ajoute un case 4 dans lequel tu fais le reader de description, et un goto case 3; pour continuer.

Ainsi quand tu va relancer, le case 4 ne sera pas lu, puisque la derniere version enregistrée était à 3, et ton serveur ne tentera pas de lire quelquechose qui n'a pas été écrit.

La dessus, le sérialize suivant écrira une version de 4 et la description, les deserialize suivants liront le case 4...

Il faut incrémenter la version à chaque modif, et gérer avec des case ou des if.


Dernière édition par Gargouille le Mar 23 Sep - 22:55, édité 1 fois
Revenir en haut Aller en bas
Pantoute

Pantoute


Messages : 44
Date d'inscription : 05/09/2008
Localisation : Québec

[Réglé]Sérialiser Empty
MessageSujet: Re: [Réglé]Sérialiser   [Réglé]Sérialiser Icon_minipostedMar 23 Sep - 2:17

Ça me fait toujours le même problème...

Code:
      public override void Serialize( GenericWriter writer )
      {
         base.Serialize( writer );

         writer.Write( (int) 4 ); // version

            writer.Write((string)m_Description);

         m_AosAttributes.Serialize( writer );
         m_AosClothingAttributes.Serialize( writer );
         m_AosSkillBonuses.Serialize( writer );
         m_AosResistances.Serialize( writer );

         writer.Write( (bool) m_PlayerConstructed );

         writer.Write( (Mobile) m_Crafter );
         writer.Write( (int) m_Quality );
      }

      public override void Deserialize( GenericReader reader )
      {
         base.Deserialize( reader );

         int version = reader.ReadInt();

         switch ( version )
         {

                case 4:
                    {

                        m_Description = reader.ReadString();

                        goto case 3;
                    }

            case 3:
            {
               m_AosAttributes = new AosAttributes( this, reader );
               m_AosClothingAttributes = new AosArmorAttributes( this, reader );
               m_AosSkillBonuses = new AosSkillBonuses( this, reader );
               m_AosResistances = new AosElementAttributes( this, reader );

               goto case 2;
            }
            case 2:
            {
               m_PlayerConstructed = reader.ReadBool();
               goto case 1;
            }
            case 1:
            {
               m_Crafter = reader.ReadMobile();
               m_Quality = (ClothingQuality)reader.ReadInt();
               break;
            }
            case 0:
            {
               m_Crafter = null;
               m_Quality = ClothingQuality.Regular;
               break;
            }
         }

         if ( version < 2 )
            m_PlayerConstructed = true; // we don't know, so, assume it's crafted

         if ( version < 3 )
         {
            m_AosAttributes = new AosAttributes( this );
            m_AosClothingAttributes = new AosArmorAttributes( this );
            m_AosSkillBonuses = new AosSkillBonuses( this );
            m_AosResistances = new AosElementAttributes( this );
         }

         Mobile parent = Parent as Mobile;

         if ( parent != null )
         {
            if ( Core.AOS )
               m_AosSkillBonuses.AddTo( parent );

            AddStatBonuses( parent );
            parent.CheckStatTimers();
         }
      }
Revenir en haut Aller en bas
http://au-crepuscule.com/?page=accueil
Gargouille




Messages : 97
Date d'inscription : 02/09/2008

[Réglé]Sérialiser Empty
MessageSujet: Re: [Réglé]Sérialiser   [Réglé]Sérialiser Icon_minipostedMar 23 Sep - 7:29

Je sèche...

Si tu n'as jamais réussi à compiler depuis que tu essayes de sérialiser ça, et donc si tu es bien sûr que ta save a bien été faite avec le code "de base", reviens à ce code, lance et save pour repartir sur de bonnes bases.

Fais toujours une sauvegarde de tes fichiers avant de toucher à la sérialisation.


Sinon, ton code à l'air correct. N'aurais tu pas réussi à faire une save à version==3 contenant une écriture de description ?
Dans ton code (celui qui a disparu le 21.09) description était à la fin.

Et si tu n'arrives pas à retrouver en code le même ordre que dans ta dernière save, il ne te reste que la solution qui craint, tu efface les objets du même type.
Revenir en haut Aller en bas
Pantoute

Pantoute


Messages : 44
Date d'inscription : 05/09/2008
Localisation : Québec

[Réglé]Sérialiser Empty
MessageSujet: Re: [Réglé]Sérialiser   [Réglé]Sérialiser Icon_minipostedMar 23 Sep - 14:22

J'avais sérializé quand ça ressemblait à ça: Mais ça me demandais de supprimé des objets (probablement dû au fait que y'avais pas de description pour les autres objets.)

Code:
      public override void Serialize( GenericWriter writer )
      {
        base.Serialize( writer );

        writer.Write( (int) 3 ); // version

        m_AosAttributes.Serialize( writer );
        m_AosClothingAttributes.Serialize( writer );
        m_AosSkillBonuses.Serialize( writer );
        m_AosResistances.Serialize( writer );

        writer.Write( (bool) m_PlayerConstructed );

        writer.Write( (Mobile) m_Crafter );
        writer.Write( (int) m_Quality );

            writer.Write((string)m_Description);
      }

      public override void Deserialize( GenericReader reader )
      {
        base.Deserialize( reader );

        int version = reader.ReadInt();

        switch ( version )
        {
            case 3:
            {
              m_AosAttributes = new AosAttributes( this, reader );
              m_AosClothingAttributes = new AosArmorAttributes( this, reader );
              m_AosSkillBonuses = new AosSkillBonuses( this, reader );
              m_AosResistances = new AosElementAttributes( this, reader );

              goto case 2;
            }
            case 2:
            {
              m_PlayerConstructed = reader.ReadBool();
              goto case 1;
            }
            case 1:
            {
              m_Crafter = reader.ReadMobile();
              m_Quality = (ClothingQuality)reader.ReadInt();
              break;
            }
            case 0:
            {
              m_Crafter = null;
              m_Quality = ClothingQuality.Regular;
              break;
            }
        }

        if ( version < 2 )
            m_PlayerConstructed = true; // we don't know, so, assume it's crafted

        if ( version < 3 )
        {
            m_AosAttributes = new AosAttributes( this );
            m_AosClothingAttributes = new AosArmorAttributes( this );
            m_AosSkillBonuses = new AosSkillBonuses( this );
            m_AosResistances = new AosElementAttributes( this );
        }

        Mobile parent = Parent as Mobile;

        if ( parent != null )
        {
            if ( Core.AOS )
              m_AosSkillBonuses.AddTo( parent );

            AddStatBonuses( parent );
            parent.CheckStatTimers();
        }
                        m_Description = reader.ReadString();
      }
Revenir en haut Aller en bas
http://au-crepuscule.com/?page=accueil
Gargouille




Messages : 97
Date d'inscription : 02/09/2008

[Réglé]Sérialiser Empty
MessageSujet: Re: [Réglé]Sérialiser   [Réglé]Sérialiser Icon_minipostedMar 23 Sep - 18:36

Donc, si à partir d'un serveur fonctionnel tu as mis le code ci dessus, effectivement il y a une erreur quand le désérialize veut lire la string description, puisqu'elle na pas été écrite précédement.

Remettre en ordre comme tu l'avais fait aurait du suffire.

Mais si je comprend bien, malgré l'erreur, ton serveur a démarré, au prix de quelques objets effacés. Ceux qui contenaient l'erreur vraisemblablement.

Si par la suite tu as .add de ces objets là, et que le serveur a fait une save, alors tes objets ont été écrits en version 3, avec description à la fin...

Donc si tout s'est bien passé ainsi, ton premier code devrait fonctionner.


En clair ton code erronné devrait fonctionner si tu efface les objets.
Ton code rectifié devrait fonctionner si ton serveur n'a pas fait de save avec le code erronné...

Avec un shard test, tout ça on s'en fout, on efface et on repart. Avec un shard plein de joueurs, il ne faut pas se tromper. Donc toujours faire une save de la save et des codes avant modification des serailize...
Revenir en haut Aller en bas
Pantoute

Pantoute


Messages : 44
Date d'inscription : 05/09/2008
Localisation : Québec

[Réglé]Sérialiser Empty
MessageSujet: Re: [Réglé]Sérialiser   [Réglé]Sérialiser Icon_minipostedMar 23 Sep - 22:22

Excellent, merci ça marche. Mais j'ai du vider mon serveur au complet. Mais c'est pas grave, de toute façon c'est à ça que ça sert un serveur test.
Revenir en haut Aller en bas
http://au-crepuscule.com/?page=accueil
Contenu sponsorisé





[Réglé]Sérialiser Empty
MessageSujet: Re: [Réglé]Sérialiser   [Réglé]Sérialiser Icon_miniposted

Revenir en haut Aller en bas
 
[Réglé]Sérialiser
Revenir en haut 
Page 1 sur 1
 Sujets similaires
-
» [Réglé]Item Lié à un autre- Pommier
» [Réglé]Mettre du texte en jeu en String
» [Réglé]Ajouter une description sous le nom d'un item

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
RunUO-FR :: Problèmes et questions :: Comment faire ?-
Sauter vers: