Pagina 2 di 2 primaprima 1 2
Visualizzazione dei risultati da 11 a 19 su 19
  1. #11
    Utente di HTML.it
    Registrato dal
    Feb 2004
    Messaggi
    200
    Originariamente inviato da KataKlism2002
    ma a questo punto la domanda mi sorge spontanea... che ci devi fare con questa stringa una volta ottenuta?
    Eh no, magari. I client connessi al server eseguono operazioni su una serie di oggetti grafici (quale il click su uno di essi). Tutti i client devono allora essere aggiornati a vicenda delle operazioni eseguite da ognuno di essi. Tuttavia quando un client si connette al server, gli si deve presentare una mappa di oggetti grafici allineati alla situazione in corso. Sicchè il server funge da accentratore e solo in questo caso particolare deve trasmettere l'insieme di tutte le informazioni relative agli oggetti grafici ed ai loro stati (nonchè background, identificativo dello user che eventualmente ha appena cliccato su esso etc). Il server è l'unico a poter fornire un aggiornamento della situazione al momento T; e lo fà serializzando gli oggetti e inviandoli al client che ha richiesto la connessione. Non è neppure tanto facile poichè gli oggetti grafici di cui parlo sono dinamici nel senso che a questi vengono aggiunti altri oggetti dai client connessi in rete.
    Poniamo ad esempio che tutti i client vedono un oggetto grafico costituito semplicemente da un "panel" background nero. Ogni client può decidere di aggiungere in esso un oggetto (una immagine ad esempio); a questo punto l'azione svolta da uno deve riflettersi sugli altri, sicchè l'immagine deve essere aggiunta ad ogni black panel di ogni client. poniamo che ognuno procede con l'aggiunta di oggetti e che in un momento T si connette un altro client. Questo deve essere aggiornato della situazione attuale in modo che venga visualizzato il black panel con gli N oggetti eventualmente inseriti dagli altri. Il server è l'unico a poter avere una mappatura completa ed a tal scopo trasmette l'oggetto black panel contenente gli N oggetti inseriti.

  2. #12
    Utente di HTML.it
    Registrato dal
    Feb 2004
    Messaggi
    200
    Eppure non riesco a far funzionare questa conversione da Memorystream a stringa e viceversa. Nel momento in cui tenta la deserializzazione della memorystream costruita da stringa, dà questo messaggio di errore:
    "Fine del flusso raggiunta prima del termine dell'analisi"

    Il problema non sembra essere nella serializzazione/deserializzazione in quanto questi vengono eseguiti correttamente se si escludono i passi intermedi di conversione da memorystream a stringa e viceversa.

    Inoltre ho notato che quando converto la Memorystream passando per un buffer matrice di bytes, la lunghezza è X ma quando con il processo inverso viene riconvertita la stringa nel buffer di bytes, la sua lunghezza è X+8.

    Questo è il semplice codice che stò provando:


    Imports System.IO
    Imports System.Text
    Imports System.ComponentModel
    Imports System.Runtime.Serialization.Formatters.Binary
    Public Class Form1

    <DesignerSerializationVisibility( _
    DesignerSerializationVisibility.Content)> _
    Public TableC As New Microsoft.VisualBasic.Collection()

    Public Structure Struttura
    Public A As String
    Public B As Integer
    Public C As Integer
    Public D As Integer
    Public E As Integer
    Public F As Integer
    Public G As Integer
    Public H As Integer
    End Structure

    Public Sub Start() Handles Me.Load

    Dim S As New Struttura
    A="prova"
    TableC.Add(S)

    Dim ms As MemoryStream = Serialize(TableC)
    Dim buffer(ms.Length) As Byte
    ms.Read(buffer, 0, ms.Length)
    Dim MyString As String = System.Text.Encoding.UTF8.GetString(buffer)

    ms.Dispose()

    MsgBox(buffer.Length)

    Dim buffer1() As Byte = Encoding.UTF8.GetBytes(MyString)
    Dim ms1 As New MemoryStream
    ms1.Write(buffer1, 0, buffer1.Length)

    MsgBox(buffer1.Length)

    '---deserializzazione
    Dim NewObj As Collection
    NewObj = Deserialize(ms1)

    End Sub



    Function Serialize(ByVal Obj As Collection) _
    As MemoryStream
    Dim ms As New MemoryStream

    Dim fs As New FileStream("c:\File.dat", _
    FileMode.Create, _
    FileAccess.Write)

    Dim formatter As New BinaryFormatter
    formatter.Serialize(ms, Obj)
    formatter.Serialize(fs, Obj)
    ms.Position = 0
    Return ms

    End Function


    Function Deserialize(ByVal ms As MemoryStream) _
    As Collection

    Dim formatter As New BinaryFormatter
    Return formatter.Deserialize(ms)

    End Function
    End Class


    Qualcuno potrebbe aiutarmi a trovare l'inghippo? Grazie.

  3. #13
    Utente di HTML.it
    Registrato dal
    Feb 2004
    Messaggi
    200
    up

  4. #14
    Utente di HTML.it
    Registrato dal
    Feb 2004
    Messaggi
    200
    up

  5. #15
    Utente di HTML.it L'avatar di Stoicenko
    Registrato dal
    Feb 2004
    Messaggi
    2,254
    però continuo a non capire il perchè del passaggio da stream di byte a stringa.. soprattutto perchè poi la riconverti in byte... il byte aggiunto potrebbe essere il carattere terminatore di stringa..

  6. #16
    Utente di HTML.it
    Registrato dal
    Feb 2004
    Messaggi
    200
    Originariamente inviato da Stoicenko
    però continuo a non capire il perchè del passaggio da stream di byte a stringa.. soprattutto perchè poi la riconverti in byte... il byte aggiunto potrebbe essere il carattere terminatore di stringa..
    Il codice postato è solo un esempio semplificato per mostrare il malfunzionamento. Il processo di serializzazione/deserializzazione e conversione stringa/byte e viceversa funzionano correttamente se utilizzati singolarmente. ma se, come in questo caso, serializzo un oggetto in una memorystream e poi la converto in stringa per poi recuperare il tutto con il processo inverso, ottengo in fase di deserializzazione l'errore descritto sopra.

    La conversione mi serve perchè devo trasmettere il risultato della serializzazione ad un client il quale è predisposto per ricevere stringhe precedute da un comando da eseguire. Il client previa analisi del comando conosce il contenuto del messaggio ricevuto (il formato) ed in quel caso specifico preleva la seconda parte della stringa, frutto della serializzazione + conversion ms/stringa da parte del server, e la riconverte prima in un buffer byte e poi di nuovo in ms per poter accedere all'oggetto con una deserializzazione.

    A prescindere comunque dall'uso che ne faccio, non capisco cosa non funzioni in quel benedetto codice. Hai provato ad eseguirlo? Hai riscontrato anche tu la stessa anomalìa?

    Non sò che pesci prendere poichè il tutto teoricamente dovrebbe funzionare.

  7. #17
    Utente di HTML.it
    Registrato dal
    Feb 2004
    Messaggi
    200
    Up
    Caspita, davvero nessuno mi sà dare un ragguaglio?

  8. #18
    Utente di HTML.it
    Registrato dal
    Feb 2004
    Messaggi
    200
    Ho aggiunto ms1.position=0 subito dopo la ms1.write e adesso l'errore in fase di deserializzazione è "nessuna mappa per l'oggetto X" dove X è una stringa con dentro un numero di n cifre. Qualcuno ha un'idea?

    Questo è il semplice codice che stò provando:


    Imports System.IO
    Imports System.Text
    Imports System.ComponentModel
    Imports System.Runtime.Serialization.Formatters.Binary
    Public Class Form1

    <DesignerSerializationVisibility( _
    DesignerSerializationVisibility.Content)> _
    Public TableC As New Microsoft.VisualBasic.Collection()

    Public Structure Struttura
    Public A As String
    Public B As Integer
    Public C As Integer
    Public D As Integer
    Public E As Integer
    Public F As Integer
    Public G As Integer
    Public H As Integer
    End Structure

    Public Sub Start() Handles Me.Load

    Dim S As New Struttura
    A="prova"
    TableC.Add(S)

    Dim ms As MemoryStream = Serialize(TableC)
    Dim buffer(ms.Length) As Byte
    ms.Read(buffer, 0, ms.Length)
    Dim MyString As String = System.Text.Encoding.UTF8.GetString(buffer)

    ms.Dispose()

    MsgBox(buffer.Length)

    Dim buffer1() As Byte = Encoding.UTF8.GetBytes(MyString)
    Dim ms1 As New MemoryStream
    ms1.Write(buffer1, 0, buffer1.Length)

    MS1.POSITION=0 'Serve per ripristinare il puntatore all'inizio dello stream

    MsgBox(buffer1.Length)

    '---deserializzazione
    Dim NewObj As Collection
    NewObj = Deserialize(ms1)

    End Sub



    Function Serialize(ByVal Obj As Collection) _
    As MemoryStream
    Dim ms As New MemoryStream

    Dim fs As New FileStream("c:\File.dat", _
    FileMode.Create, _
    FileAccess.Write)

    Dim formatter As New BinaryFormatter
    formatter.Serialize(ms, Obj)
    formatter.Serialize(fs, Obj)
    ms.Position = 0
    Return ms

    End Function


    Function Deserialize(ByVal ms As MemoryStream) _
    As Collection

    Dim formatter As New BinaryFormatter
    Return formatter.Deserialize(ms)

    End Function
    End Class

  9. #19
    Utente di HTML.it
    Registrato dal
    Feb 2004
    Messaggi
    200
    Caso risolto.
    Ho dovuto rivoluzionare il tutto poichè era evidente che il sistema object-->Memorystream-->buffer byte-->string e ritorno non funzionava affatto. In poche parole i processi di serializzazione/deserializzazione e conversione bufferbyte/stringa/bufferbyte se presi singolarmente funzionano ma cablati no. Almeno non per lo scopo prefisso.

    Quindi buttato via tale sistema ho impiantato questo che sembra l'unico che funzioni bene (ecco perchè in un post dissi che spesso VB è come un labirinto pieno di vicoli ciechi ed una sola uscita).
    Consiglio a chi ha a che fare con passaggio di oggetti da server a client di tenersi ben stretto il seguente codice:

    Imports System.IO
    Imports System.Text
    Imports System.ComponentModel
    Imports System.Runtime.Serialization.Formatters.Binary
    Public Class Form1

    <DesignerSerializationVisibility( _
    DesignerSerializationVisibility.Content)> _
    Public TableC As New Microsoft.VisualBasic.Collection()

    <Serializable()>Public Structure Struttura
    Public A As String
    Public B As Integer
    Public C As Integer
    Public D As Integer
    Public E As Integer
    Public F As Integer
    Public G As Integer
    Public H As Integer
    End Structure

    Public Sub Start() Handles Me.Load

    Dim S As New Struttura
    A="prova"
    TableC.Add(S)
    Dim b As String = Serialize(TableC)
    MessageBox.Show(b)

    TableC.Clear()
    Dim c As Collection = Deserialize(b)

    S = c(1)
    MessageBox.Show(S.A)

    End Sub

    '*** Serializzazione ***
    Private Function Serialize(ByVal _
    Obj As Collection) As String

    Dim bf As New Runtime.Serialization.Formatters.Binary.BinaryForm atter
    Dim ms As New IO.MemoryStream
    bf.Serialize(ms, Obj)
    Return Convert.ToBase64String(ms.ToArray())

    End Function

    '*** Deserializzazione ***
    Private Function Deserialize(ByVal _
    ObjString As String) As Collection

    Dim bf As New Runtime.Serialization.Formatters.Binary.BinaryForm atter
    Dim ms As New IO.MemoryStream(Convert.FromBase64String(ObjString ))
    Return DirectCast(bf.Deserialize(ms), Collection)

    End Function

    End Class



    Io ho usato la Collection per memorizzare gli oggetti, questa però richiede il settaggio di particolari attributi (non basta il serializable). Si potrebbe tuttavia tenere in considerazione anche l'ArrayList.

    Ciao a tutti.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.