RunUO-FR

Forum de support pour RunUO en français.
 
AccueilAccueil  FAQFAQ  RechercherRechercher  MembresMembres  GroupesGroupes  S'enregistrerS'enregistrer  Connexion  

Partagez
 

 Serialize/Deserialize

Aller en bas 
AuteurMessage
Scriptiz

Scriptiz

Messages : 101
Date d'inscription : 02/09/2008
Localisation : Belgium

Serialize/Deserialize Empty
MessageSujet: Serialize/Deserialize   Serialize/Deserialize Icon_minipostedMar 2 Sep - 10:35

Le Serialize/Deserialize (Traduction du tutorial de Krrios par crystal)

Pour sauver et loader le monde, RunUO utilise la serialisation. Chaque item ou mobile que vous scriptez doit obligatoirement avoir 3 méthodes différentes associées à ça.
La première est très simple, c'est un constructeur de serialisation appelé lorsque l'objet est charge a partir d'une save. En général on peut se contenter d'un simple prototype.

Exemple:
Code:
public MyClassName( Serial serial ) : base( serial )
{
}

Tout ce que ce code fait est appeler le constructeur de votre classe.

Les 2 méthodes suivantes sont utilisées pour serializer/deserializer (sauver et loader) ces méthodes on un paramètre chacune, un GenericWriter et un GenericReader. Ils offrent des méthodes pour lire et écrire les données que vous avez dans le fichier de save.

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

 writer.Write( (int) 0 ); // version
}

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

 int version = reader.ReadInt();
}

Pour les scripts simples, oµ tous les champs sont serializes, c'est tout ce dont vous avez besoin.
Vous pouvez remarquer un numéro de "version", c'est pour la compatibilité ascendante. Si vous modifiez les champs dans votre script votre save fonctionnera toujours.

Voici un exemple pour 2 champs, une string et un nombre int

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

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

 writer.Write( m_StringField );
 writer.Write( m_NumberField );
}

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

 int version = reader.ReadInt();

 switch ( version )
 {
  case 0:
  {
    m_StringField = reader.ReadString();
    m_NumberField = reader.ReadInt();

    break;
  }
 }
}

Le "switch ( version )" vous permet de gérer ces versions, il vous permet d'ajouter par exemple un champ sans que l'objet ne sois efface pour cause d'erreur de lecture du fichier.

Voici comment faire pour ajouter un champ à un objet :

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

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

 writer.Write( m_StringField2 );

 writer.Write( m_StringField );
 writer.Write( m_NumberField );
}

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

 int version = reader.ReadInt();

 switch ( version )
 {
  case 1:
  {
    m_StringField2 = reader.ReadString();

    goto case 0;
  }
  case 0:
  {
    m_StringField = reader.ReadString();
    m_NumberField = reader.ReadInt();

    break;
  }
 }
}

Le numéro de version est changé de 0 a 1 et le champ a été ajouté a la méthode Serialize. Si ce script charge un ancien WorldFile (avec la version 0) il n'essayera pas de lire quelque chose pour "m_StringField2"

Il existe aussi un autre moyen pour par exemple convertir les PlayerMobiles lors d'une upgrade, il suffit de prendre le script du nouveau PlayerMobile, et remplacer le Serialize existant par celui qu'on utilisait avant, adapter le Serialize pour avoir l'intégralité des données a sauver.
On lance le serveur, on fait un SaveWorld on coupe le serveur et la il ne suffit plus que de reconstruire le Deserialize du PlayerMobile pour qu il puisse enfin lire l'integralite des donnees.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://uoclassic.free.fr/
Gargouille



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

Serialize/Deserialize Empty
MessageSujet: Re: Serialize/Deserialize   Serialize/Deserialize Icon_minipostedMar 23 Sep - 23:04

Pour dire la même chose, je rajoute ceci...
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
 
Serialize/Deserialize
Revenir en haut 
Page 1 sur 1

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
RunUO-FR :: Tutoriaux Scripts :: Tutoriaux RunUO-
Sauter vers: