| | [Réglé]Sérialiser | |
| | Auteur | Message |
---|
Gargouille
Messages : 97 Date d'inscription : 02/09/2008
| Sujet: [Réglé]Sérialiser Lun 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 | |
| | | Pantoute
Messages : 44 Date d'inscription : 05/09/2008 Localisation : Québec
| Sujet: Re: [Réglé]Sérialiser Mar 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(); } } | |
| | | Gargouille
Messages : 97 Date d'inscription : 02/09/2008
| Sujet: Re: [Réglé]Sérialiser Mar 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. | |
| | | Pantoute
Messages : 44 Date d'inscription : 05/09/2008 Localisation : Québec
| Sujet: Re: [Réglé]Sérialiser Mar 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(); } | |
| | | Gargouille
Messages : 97 Date d'inscription : 02/09/2008
| Sujet: Re: [Réglé]Sérialiser Mar 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... | |
| | | Pantoute
Messages : 44 Date d'inscription : 05/09/2008 Localisation : Québec
| Sujet: Re: [Réglé]Sérialiser Mar 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. | |
| | | Contenu sponsorisé
| Sujet: Re: [Réglé]Sérialiser | |
| |
| | | | [Réglé]Sérialiser | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |