Serialisation XML d'un byte dans un fichier au format hexa ?

Résolu
billou_13 Messages postés 860 Date d'inscription jeudi 4 mars 2004 Statut Membre Dernière intervention 19 août 2014 - 3 août 2007 à 11:31
billou_13 Messages postés 860 Date d'inscription jeudi 4 mars 2004 Statut Membre Dernière intervention 19 août 2014 - 3 août 2007 à 18:08
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

cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
3 août 2007 à 11:51
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-
3
billou_13 Messages postés 860 Date d'inscription jeudi 4 mars 2004 Statut Membre Dernière intervention 19 août 2014 29
3 août 2007 à 18:08
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
---------------------
3
SharpMao Messages postés 1024 Date d'inscription mardi 4 février 2003 Statut Membre Dernière intervention 7 juin 2010 69
3 août 2007 à 11:37
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)
0
billou_13 Messages postés 860 Date d'inscription jeudi 4 mars 2004 Statut Membre Dernière intervention 19 août 2014 29
3 août 2007 à 13:40
(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
---------------------
0
Rejoignez-nous