Xmlserializer et networkstream

Résolu
cs_yadzamalo Messages postés 8 Date d'inscription mardi 11 janvier 2011 Statut Membre Dernière intervention 21 avril 2012 - 18 avril 2012 à 00:06
cs_yadzamalo Messages postés 8 Date d'inscription mardi 11 janvier 2011 Statut Membre 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.

7 réponses

NHenry Messages postés 15083 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 19 septembre 2023 159
19 avril 2012 à 23:00
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
---
3
NHenry Messages postés 15083 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 19 septembre 2023 159
18 avril 2012 à 12:40
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
---
0
cs_yadzamalo Messages postés 8 Date d'inscription mardi 11 janvier 2011 Statut Membre Dernière intervention 21 avril 2012
19 avril 2012 à 10:12
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.
0
NHenry Messages postés 15083 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 19 septembre 2023 159
19 avril 2012 à 12:33
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
---
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_yadzamalo Messages postés 8 Date d'inscription mardi 11 janvier 2011 Statut Membre Dernière intervention 21 avril 2012
19 avril 2012 à 22:50
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.
0
NHenry Messages postés 15083 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 19 septembre 2023 159
19 avril 2012 à 22:58
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
---
0
cs_yadzamalo Messages postés 8 Date d'inscription mardi 11 janvier 2011 Statut Membre Dernière intervention 21 avril 2012
21 avril 2012 à 10:32
Merci pour ta reponse, je vais me pencher sur ta methode.
0
Rejoignez-nous