Xmlserializer et networkstream [Résolu]

Messages postés
8
Date d'inscription
mardi 11 janvier 2011
Dernière intervention
21 avril 2012
- - Dernière réponse : cs_yadzamalo
Messages postés
8
Date d'inscription
mardi 11 janvier 2011
Dernière intervention
21 avril 2012
- 21 avril 2012 à 10:32
Bonjours à tous, je cherche desesperement un moyen de serializer un objet avec xmlserializer à travers le flux networkstream. Avant toutes choses j'arrive à serializer mon objet en fermant le networkstream apres chaques appels de serialize(), en appelant close(), mais voilà cette methode me ferme en meme temps mon socket donc je suis obligé de redemarrer un nouveau socket pour envoyer mon objet, je m'addresse à vous afin que vous me veniez en aide pour m'indiquer une autre methode où je pourrai utiliser le meme socket sans le fermer.
ps: je connais binaryformatter egalement mais comme je programme une application pour pocket pc avec le framerwork 3.5, malheureusement binaryformatter n'est pas pris en charge.
Merci pour vos reponses.
Afficher la suite 

Votre réponse

7 réponses

Meilleure réponse
Messages postés
14397
Date d'inscription
vendredi 14 mars 2003
Dernière intervention
23 mars 2019
154
3
Merci
Bonjour,

Petit oubli, la fonction à mettre dans un module :
    ''' <summary>
    ''' Retourne une partie d'un tableau
    ''' </summary>
    ''' Tableau à traiter


    ''' Offset de départ


    ''' Longueur


    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function GetArrayRange(ByVal ptByte As Byte(), ByVal pOffset As Integer, ByVal pLength As Integer) As Byte()
        Dim ltByte As New List(Of Byte)
        ltByte.AddRange(ptByte)
        Return ltByte.GetRange(pOffset, pLength).ToArray
    End Function


---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, celui-ci pour bien poser votre question ou encore celui-ci pour les PFE et autres exercices[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]En VB.NET pensez à activer Option Explicit et Option Strict (propriété du projet) et à retirer l'import automatique de l'espace de nom Microsoft.VisualVasic (onglet Références dans les propriétés du projet).
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 120 internautes nous ont dit merci ce mois-ci

Commenter la réponse de NHenry
Messages postés
14397
Date d'inscription
vendredi 14 mars 2003
Dernière intervention
23 mars 2019
154
0
Merci
Bonjour,

Quel code utilises-tu actuellement (voir le point 2 de ma signature).

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, celui-ci pour bien poser votre question ou encore celui-ci pour les PFE et autres exercices[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]En VB.NET pensez à activer Option Explicit et Option Strict (propriété du projet) et à retirer l'import automatique de l'espace de nom Microsoft.VisualVasic (onglet Références dans les propriétés du projet).
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
Commenter la réponse de NHenry
Messages postés
8
Date d'inscription
mardi 11 janvier 2011
Dernière intervention
21 avril 2012
0
Merci
bonjour, voici mon code :
coté serveur :
using System;
using System.Linq;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Net.Sockets;
using System.Net;
using System.IO;
using System.Xml.Serialization;

namespace SmartDeviceProject2
{
    public partial class Form2 : Form
    {
        Socket tcpc = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        TcpClient tcpc1 = new TcpClient();
        public Form2()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            TcpListener tcpl = new TcpListener(new IPEndPoint(IPAddress.Parse("192.168.1.171"), 5555));
            tcpl.Start() ;
            tcpc1 = tcpl.AcceptTcpClient() ;
            tcpl.Stop();
            NetworkStream ns = new NetworkStream(tcpc);
            string[] pl = Directory.GetDirectories("C:\");
            string[] kj = Directory.GetFiles("C:\");
            XmlSerializer xmls = new XmlSerializer(typeof(Class1));
                Class1 class1 = new Class1();
                class1.directory = pl;
                class1.FIles = kj;
                xmls.Serialize(ns, class1);
                ns.Close(); 
            
            string hp = "y";
            while (hp == "y")
            {
           
            XmlSerializer xmls1 = new XmlSerializer(typeof(string));
            
                    string io = (string)xmls1.Deserialize(ns);
                    switch (io)
                    {
                        case "a":

                            string uy = (string)xmls1.Deserialize(ns);
                            Class1 lk = new Class1();
                            lk.directory = Directory.GetDirectories(uy);
                            lk.FIles = Directory.GetFiles(uy);
                            xmls.Serialize(ns, lk);
                            ns.Close();
                            break;
                    }
                }
            }
            }

Merci pour ton aide.
Commenter la réponse de cs_yadzamalo
Messages postés
14397
Date d'inscription
vendredi 14 mars 2003
Dernière intervention
23 mars 2019
154
0
Merci
Bonjour,

C'est toi qui ferme le NetworkStream :
xmls.Serialize(ns, lk);
ns.Close();

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, celui-ci pour bien poser votre question ou encore celui-ci pour les PFE et autres exercices[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]En VB.NET pensez à activer Option Explicit et Option Strict (propriété du projet) et à retirer l'import automatique de l'espace de nom Microsoft.VisualVasic (onglet Références dans les propriétés du projet).
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
Commenter la réponse de NHenry
Messages postés
8
Date d'inscription
mardi 11 janvier 2011
Dernière intervention
21 avril 2012
0
Merci
Enfaite je suis obligé de le fermer pour recevoir mes données, sinon la methode deserialize() bloque en permanence en ettente d'autre données, je voulais connaitre un autre moyen de serializer mon objet sans etre obligé de fermer mon networkstream en utilisant xmlserializer, car si il faut qu'a chaque fois je ferme mon tcpclient car il se ferme automatiquement aprés la fonction close du networkstream, j'ai une perte de temp considerable entre les échangesde données, dans tous les cas je te remercie de m'avoir repondu.
Commenter la réponse de cs_yadzamalo
Messages postés
14397
Date d'inscription
vendredi 14 mars 2003
Dernière intervention
23 mars 2019
154
0
Merci
Bonjour,

Tu peux faire un petit protocole, par exemple, envoi de 4 octets représentant la longueur des données sérialisées, et pour assurer que la désérialisation ne bloque pas, tu peux faire un héritage de la classe IO.Stream cette nouvelle classe, ne conservera que les données de l'objet, et pas tout le flux entre le client et le serveur.

Voici les 2 classes que j'ai fait pour ça (à noter l'origine dans tes commentaires) :
''' <summary>
''' Flux de buffer, fonctionne comme MemoryStream, mais sans mémorisation des données
''' </summary>
''' <remarks></remarks>
Public NotInheritable Class BufferStream
    Inherits Stream

    ''' <summary>
    ''' Tampon
    ''' </summary>
    ''' <remarks></remarks>
    Private mDatas As New List(Of Byte)

    ''' <summary>
    ''' Retourne la quantité des données
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Overrides ReadOnly Property Length() As Long
        Get
            Return mDatas.Count
        End Get
    End Property

    ''' <summary>
    ''' Lit les données dans le tampon
    ''' </summary>
    ''' Nombre max d'octets à lire


    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Overloads Overrides Function Read(ByVal pCount As Integer) As Byte()
        Dim ltData As Byte()
        Do While mDatas.Count = 0 And Not mIsClose
            Threading.Thread.Sleep(10)
        Loop
        SyncLock mDatas
            If pCount < mDatas.Count Then
                ltData = mDatas.GetRange(0, pCount).ToArray
                mDatas.RemoveRange(0, pCount)
            Else
                ltData = mDatas.ToArray
                mDatas.Clear()
            End If
        End SyncLock
        Return ltData
    End Function
    ''' <summary>
    ''' Ecrit de données dans le flux
    ''' </summary>
    ''' Données


    ''' Offset de début de lecture


    ''' Longueur de récupération


    ''' <remarks></remarks>
    Public Overloads Overrides Sub Write(ByVal buffer() As Byte, ByVal offset As Integer, ByVal count As Integer)
        SyncLock mDatas
            mDatas.AddRange(GetArrayRange(buffer, offset, count))
        End SyncLock
    End Sub
End Class


Public MustInherit Class Stream
    Inherits IO.Stream

    Protected mIsClose As Boolean = False

    Public Overrides ReadOnly Property CanRead() As Boolean
        Get
            Return True
        End Get
    End Property

    Public Overrides ReadOnly Property CanSeek() As Boolean
        Get
            Return False
        End Get
    End Property

    Public Overrides ReadOnly Property CanWrite() As Boolean
        Get
            Return True
        End Get
    End Property

    Public Overrides Sub Flush()
        'Ne rien faire
    End Sub

    Public Overrides Property Position() As Long
        Get
            Return 0
        End Get
        Set(ByVal value As Long)
            Throw New NotImplementedException
        End Set
    End Property

    Public Overrides Function Read(ByVal buffer() As Byte, ByVal offset As Integer, ByVal count As Integer) As Integer
        Dim ltData As Byte()
        ltData = Read(count)
        ltData.CopyTo(buffer, offset)
        Return ltData.Length
    End Function

    Public MustOverride Overloads Function Read(ByVal pCount As Integer) As Byte()

    Public Overrides Function Seek(ByVal offset As Long, ByVal origin As System.IO.SeekOrigin) As Long
        Throw New NotImplementedException
    End Function

    Public Overrides Sub SetLength(ByVal value As Long)
        Throw New NotImplementedException
    End Sub

    Public Overloads Sub Write(ByVal buffer() As Byte, ByVal count As Integer)
        Write(buffer, 0, count)
    End Sub

    Public Overloads Sub Write(ByVal buffer() As Byte)
        Write(buffer, buffer.Length)
    End Sub

    Public Overrides Sub Close()
        mIsClose = True
        MyBase.Close()
    End Sub
End Class


A toi de tester :)

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, celui-ci pour bien poser votre question ou encore celui-ci pour les PFE et autres exercices[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]En VB.NET pensez à activer Option Explicit et Option Strict (propriété du projet) et à retirer l'import automatique de l'espace de nom Microsoft.VisualVasic (onglet Références dans les propriétés du projet).
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
Commenter la réponse de NHenry
Messages postés
8
Date d'inscription
mardi 11 janvier 2011
Dernière intervention
21 avril 2012
0
Merci
Merci pour ta reponse, je vais me pencher sur ta methode.
Commenter la réponse de cs_yadzamalo

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.