IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Sérialisation binaire - fin de flux inattendue


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2010
    Messages : 5
    Par défaut Sérialisation binaire - fin de flux inattendue
    Bonjour à tous,

    mon problème est assez simple en théorie. Je cherche à stocker des informations dans une base SQL Serveur, une grande partie des données ne présentent pas d'intérêt en terme de fonctionnalité base de données (pas d'indexation, pas de recherche...) , le SGBD sert juste à stocker un identifiant et des données binaires (en fait des objets géoréférencés).
    Je stocke donc sur SQL un Id + trois bricoles et un champs VarBinary.

    Pour écrire ce champs VarBinary, je passe par la sérialisation des objets de mon application. Ce qui fonctionne correctement. J'ai donc les données "en bloc" dans ma base et je peux les retrouver sans soucis via l'Id.

    PROBLEME : lors de la récupération des données, je place le contenu du champs binaire dans un flux puis je le passe à mon désérialiseur...
    ET LA :
    Fin de flux rencontrée avant la fin de l'analyse.
    Rien trouvé chez microsoft, ni sur le forum ici.
    Par acquis de conscience, j'ai même tenté de faire une désérialisation immédiatement après la sérialisation (à partir du même MemoryStream) pour éviter les effets de bords possibles avec le SGBD. Toujours le même soucis.
    J'ai même réduit la taille de mon objet au simple Id (type Long), rien à faire !

    Extrait du code (version minimale sans l'écriture dans la base) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    public Donnees as new system.IO.memoryStream
    public Formatteur as new Formatter.binary.binaryFormatter
     
    ' Ecrit l'objet en paramètre dans la base 
    ' Retour TRUE si l'opération s'est déroulée correctmeent, FALSE sinon
    public Function Objet_Ecrit(byval o as oObjet) as boolean
    Dim retour as boolean
     
    Formatteur.serialize(donnees, o)
    o=Formatteur.deserialize(donnees) *
     
    Retour Return
    End Function
    * L'erreur se produit sur cette ligne.

    Quelqu'un a-t-il une idée ?
    Bien entendu, le contenu du MemorySTream est parfaitement identique entre les deux lignes.
    Même avec un objet instancié d'une classe ne possédant qu'une seule propriété de type long, l'erreur persiste.

  2. #2
    Membre émérite Avatar de ctxnop
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2007
    Messages : 858
    Par défaut
    Salut,
    le code ne nous apprend pas grand chose, tu sembles avoir tellement tranché dedans qu'il est en complètement faux.

    En effet, il manque le using sur le stream ce qui fait que le flux n'est pas fermé, tu dé-sérialises sans remettre l'index du stream au début de celui-ci (Donnees.Seek(0, SeekOrigin.Begin)), comme il n'y a pas de using il n'y a pas de flush (Donnees.Flush()) sur le stream non plus ce qui fais que tu dé-sérialise un stream qui ne contient peut être pas encore tes données, etc...

    Un code un peu plus complet sans ces erreurs serait le bienvenu histoire de pouvoir t'aider.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2010
    Messages : 5
    Par défaut
    Merci !

    En fait, l'erreur était précisement dans l'écriture du flux !

    Pas de flush : flux incomplet, à la relecture bien entendu les données ne sont pas toutes prises en compte.
    Le seek était fait mais effectivement pas reporté.

    Merci encore, je suis resté longtemps là dessus et les yeux tellement sur le guidon que je n'ai pas vu l'évidence !

    Bonne soirée !

    Code fonctionnel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
     
    public Donnees as new system.IO.memoryStream
    public Formatteur as new Formatter.binary.binaryFormatter
     
    ' Ecrit l'objet en paramètre dans la base 
    ' Retour TRUE si l'opération s'est déroulée correctmeent, FALSE sinon
    public Function Objet_Ecrit(byval o as oObjet) as boolean
    Dim retour as boolean
    Dim rs as new recordset
     
    Formatteur.serialize(donnees, o)
    donnees.flush
    donnees.seek(0, SeekOrigin.Begin)
    Dim Buffer(Donnees.length) as Byte
    Donnees.Read(Buffer,0,Donnees.length)
     
    try
    rs.open("SELECT * FROM OBJETS;", _DBConnect, cursorTypeEnum.ADOpenKeySet, LockTypeEnum.ADLockPessimistic)
    rs.addnew
    rs.fields(cId).value=o.Id
    rs.fields(cDonnees)=Buffer
    rs.update
    rs.close
    retour=true
    catch ex as exception
    MsgBox("Une erreur est survenue lors de l'enregistrement de l'objet " & o.Id & vbcrlf & _
    "Le message retourné était : " & ex.message, cDIALOG_ERREUR, _
    "ECRITURE SUR LA BASE DE DONNEES IMPOSSIBLE")
    end try
     
    o=Formatteur.deserialize(donnees) *
     
    Retour Return
    End Function
     
    ' Lit les données correspondant à l'objet passé en paramètre dans la base de données
    ' et met à jour les attributs de l'objet.
    ' Retourne TRUE si l'objet existe et a pu être lu correctement, FALSE sinon
    Public Function Objet_Lit(ByRef o as oObjet) as boolean
    dim retour as boolean
    dim rs as new recordset
     
    try
    rs.open("SELECT * FROM OBJETS WHERE [IdObjet]=" & o.Id & " ;", _dbconnect, cursorTypeEnum.ADOpenForwardOnly, LockTypeEnum.ADLockReadOnly)
    Dim Buffer() as byte=rs.fields(cDonnees).value
    Donnees.write(Buffer, 0, Buffer.count)
    o=Formatteur.deserialise(Donnees)
    retour=true
    catch
    MsgBox("Une erreur est survenue lors de la lecture de l'objet " & o.Id & vbcrlf & _
    "Le message retourné était : " & ex.message, cDIALOG_ERREUR, _
    "LECTURE DANS LA BASE DE DONNEES IMPOSSIBLE")
    retour=false
    end try
     
    return retour
    end function

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Sérialisation binaire sans "Serializable"
    Par ®om dans le forum Persistance des données
    Réponses: 1
    Dernier message: 03/08/2007, 12h10
  2. Réponses: 4
    Dernier message: 10/01/2007, 17h50
  3. lecture binaire sur un flux
    Par zais_ethael dans le forum C++
    Réponses: 9
    Dernier message: 29/08/2006, 01h11
  4. Erreur: Fin de fichier inattendue.
    Par Berzerk_ dans le forum C++
    Réponses: 22
    Dernier message: 01/06/2006, 17h07
  5. "error : fin de fichier inattendue" en C++
    Par mateo.14 dans le forum MFC
    Réponses: 9
    Dernier message: 28/01/2005, 09h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo