none
Sérialisation d'un tableau d'octets: uniquement en base 64 ? RRS feed

  • Question

  • Bonjour à tous !

     

    J'ai écrit un xsd qui décrit un format de fichiers. A l'intérieur, j'ai décrit un SimpleType de type liste d'octets comme ceci:

     

    <xs:simpleType name="Ubytes">
     <xs:list itemType="xs:unsignedByte" />
    </xs:simpleType>
    

     

    Ensuite, j'utilise xsd.exe pour générer une classe sérialisable représentant ce schéma. Le champs utilisant "Ubytes" est comme ceci:

     

    /// <remarks/>
    // Avertissement CODEGEN : L'attribut DefaultValue des membres de type System.Byte[] n'est pas pris en charge dans cette version du .Net Framework.
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public byte[] Color
    {
     get { return this.colorField; }
     set { this.colorField = value; }
    }
    

     

    Jusque là tout va bien, l'avertissement ne me dérange pas. Ensuite, j'écris un xml comme ceci:

     

    <Truc Color="21 23 21 1" />
    

     

    C'est validé par le schéma. Mais maintenant, les choses se corsent un peu, je tente de déserialiser ce xml via un Serializer du bon type:

     

    using (var stream = File.OpenRead(filename))
    {
     _serializer.Deserialize(stream);
    }
    

     

    Et voilà qu'il me sort une l'exception suivante:

     

    System.InvalidOperationException was unhandled
     Message=There is an error in XML document (6, 34).
     Source=System.Xml
     StackTrace:
      at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle, XmlDeserializationEvents events)
      at System.Xml.Serialization.XmlSerializer.Deserialize(Stream stream)
      blablabla...
     InnerException: System.FormatException
      Message=Invalid length for a Base-64 char array.
      Source=mscorlib
      StackTrace:
       at System.Convert.FromBase64String(String s)
       at System.Xml.Serialization.XmlCustomFormatter.ToByteArrayBase64(String value)
       at System.Xml.Serialization.XmlSerializationReader.ToByteArrayBase64(String value)
       encore blablabla...
    

     

    Donc en fait, il essaie de déserialiser mon "21 23 21 1" comme si c'était un mot en base 64 ! Et non pas comme la concaténation des nombres 21, 23, 21 et 1.

     

    J'ai essayé la même chose avec "double" au lieu de "unsignedByte" et cette fois tout fonctionne parfaitement.

     

    Y-a-t-il un attribut à rajouter pour lui faire comprendre que ce n'est pas un mot en base 64 ? Est-ce tout simplement impossible ? Ca serait triste...

     

    D'avance merci !

     

    PS: je sais qu'on peut décrire une couleur en xml différemment que ce que je fais, mais là n'est pas la question ^^

    jeudi 17 février 2011 15:26

Réponses

  • Bonjour,

     

    Pour le bénéfice des autres qui se confrontent au même problème, je traduis la réponse de MVP Yaron Naveh sur le forum anglais :

     

    « Les seules sérialisations binaires supportées par xsd.exe sont base64binary et hex (donc le type xsd devrait être hexbinary) :

    [XmlElement(DataType="hexBinary")]
    public byte [] HexBytes ; 
    

     

     

    Dans votre cas il s’agit d’une autre chose: xsd:list n’est pas complétement supporté par .NET

    Vous avez la choix entre base64binary et hexBinary et le premier est le plus efficace ».

     

    Cordialement,

    Alex

    ________________

    Publiez un article sur MSDN !

    Windows Phone 7

    Astuces pour Visual Studio 2010

    XNA – Développement jeux vidéo

    Didacticiels et astuces : VB.NET, C#, ASP.NET, .NET Framework, Silverlight, Workflow Foundation, SharePoint, WPF

    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

     

     

     
    Suivez MSDN sur Twitter 

    • Marqué comme réponse Alex Petrescu jeudi 24 février 2011 09:31
    mercredi 23 février 2011 11:45

Toutes les réponses