Serialisation XML d'un byte dans un fichier au format hexa ? [Résolu]

Signaler
Messages postés
860
Date d'inscription
jeudi 4 mars 2004
Statut
Membre
Dernière intervention
19 août 2014
-
Messages postés
860
Date d'inscription
jeudi 4 mars 2004
Statut
Membre
Dernière intervention
19 août 2014
-
Bonjour, bonjour ^^


Une t'chite question en ce beau mois d'Août qui ne devrait pas être si terrible que ça à résoudre.


J'ai un objet classique comme ceci:


public class Octet
{
   private byte _value;
   public byte Value { get { return _value; } set { _value=value; } }

   public Octet(byte value)
   {
      _value = value;
   }
}

Et comme j'aime bien le XML, j'utilise le XmlSerializer pour sauvegarder mes objets "Octet":
Octet curObj = new Octet(0x1A);
XmlSerializer serial = new XmlSerializer(typeof(Octet));
TextWriter writer = new StreamWriter("C:\TEMP\Test.xml");
x.Serialize(writer, curObj);




Tout cela marche très bien. Cependant, mon petit souci vient du fait que la valeur (value) de mon objet Octet est sauvegardé en décimal. C'est à dire que pour l'exemple:
 Il sauvegarde la valeur "26" dans le fichier Xml.

Ma question est donc, est-ce qu'il y a un moyen de sauvegarder la valeur en octet dans le fichier (valeur "0x1A" plutot que "26") ?
Peut-être une surcharge au niveau du XmlSerializer ?

Merci d'avance et très bon mois d'Août à tous,

Billou_13
Bask En Force

--------------------------------------------------------------------
Connaître la réponse est une chose, savoir pourquoi en est une autre
---------------------

4 réponses

Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
54
Euh oui c'est effectivement possible, mais je n'en vois pas l'utilité non plus...
Si tu veux vraiment le faire, le plus simple c'est peut-être d'avoir un string qui représent ton octet...

[

XmlIgnore()]

public
byte Value
{
  
get {
return _value; }
  
set { _value =
value; }
 }

public
string Value1
{
  
get {
return
string.Format(
"0x{0:X}", _value); }
  
set { ... }
}
Lourd pour rien si tu veux mon avis !
Peut-être qu'on peut faire mieux mais même dans ce cas je n'en verrais pas l'utilité...

<hr />
-Blog-
Messages postés
860
Date d'inscription
jeudi 4 mars 2004
Statut
Membre
Dernière intervention
19 août 2014
23
J'ai trouvé une autre solution comme je pensais.

Il suffit de faire dérivé la classe de l'interface IXmlSerializable et d'en implémenter les méthodes. Résultat: on gère tout. Ce qui donne le code

//Namespaces à ajouter
using System.Xml;
using System.Xml.Schema;
using System.Xml.Serialization;
//--

public class Octet : IXmlSerializable
{
   private byte _value = 0x00;
   public byte Value { get { return _value; } set { _value=value; } }

   //Je ne sais plus si ce constructeur est obligatoire pour la sérialisation XML
   public Octet()
   {
   }

   public Octet(byte value)
   {
      _value = value;
   }

   //Méthode qui sert pour la sérialisation en fichier XML (appelé lors du XmlSerializer.Serialize(...))
   public void WriteXml(XmlWriter writer)
   {
      writer.WriteElementString("Hexa", string.Format("0x{0:X2}", _value));
   }

   //Méthode pour la désérialisation du fichier XML (appelé lors du XmlSerializer.Deserialize(...))
   public void ReadXml(XmlReader reader)
   {
      _value = Convert.ToByte(reader.ReadElementString("Hexa"), 16);
   }

   //Obligatoire par l'interface, je ne sais pas totalement à quoi elle sert (dans le doute, je m'abstiens ^^)
   public XmlSchema GetSchema()
   {
      return (null);
   }
}

Et voila ^^

Bon week-end à tous,

Billou_13
Bask En Force

--------------------------------------------------------------------
Connaître la réponse est une chose, savoir pourquoi en est une autre
---------------------
Messages postés
1024
Date d'inscription
mardi 4 février 2003
Statut
Membre
Dernière intervention
7 juin 2010
62
Hello,

Comme tu le dis si bien "Connaître la réponse est une chose, savoir pourquoi en est une autre"

Oui, c'est possible, mais pourquoi veux-tu le faire ?

26 et 0x1A représentent la même chose.

Amicalement, SharpMao

"C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!"
(Coluche / 1944-1986 / Pensées et anecdotes)
Messages postés
860
Date d'inscription
jeudi 4 mars 2004
Statut
Membre
Dernière intervention
19 août 2014
23
(Désolé pour ma dernière réponse, y'a du avoir une erreur, on voit rien)

Merci à vous,

C'est tout simplementd'un point de vue pratique. Je fais un logiciel de
communication qui envoie des trames d'octets. La sauvegarde des trames doit
donc etre explicite visuellement.
Et si les utilisateurs doivent sortir la calculatrice windows à chaque fois
qu'ils veulent ajouter une trame, c'est pas terrible et ca passera pas. Ils
seront saouler ^^

Je vous remercie en tout cas pour la réponse, j'y avais pas pensé mais je
vais passer par un stringValue comme cité ci-dessus.

Bonne fin de journée,

Billou_13
Bask En Force

--------------------------------------------------------------------
Connaître la réponse est une chose, savoir pourquoi en est une autre
---------------------