TreeNode convertieren

  • VB.NET
  • .NET (FX) 4.0

Es gibt 22 Antworten in diesem Thema. Der letzte Beitrag () ist von DanceNgine.

    TreeNode convertieren

    Halli Hallo!

    Ich haben grad folgendes Problem:
    Ich habe ein TreeView, dies wird in x abständen in einer var. ( Dim myTreeNodeArray(TreeView1.Nodes.Count - 1) As TreeNode ) zwischengespeichert.
    Nun müsste ich "myTreeNodeArray" so "convertieren", dass ich es via BinaryWriter senden, und mit BinaryReader empfangen kann, und in einer anderen Form das TreeView zu füllen.. Datenübertragung klappt alles (Getestet mit einer JPG-Datei).
    Aktuell bin ich so weit:

    TreeNode var. füllen:

    Quellcode

    1. Dim myTreeNodeArray(TreeView1.Nodes.Count - 1) As TreeNode
    2. TreeView1.Nodes.CopyTo(myTreeNodeArray, 0)


    Verschicken ( bmp )

    Quellcode

    1. Dim fn As String = "temp.bmp"
    2. Dim fs As New FileStream("F:\Testfiles\" & fn, _
    3. FileMode.Open)
    4. Dim b(fs.Length - 1) As Byte
    5. fs.Read(b, 0, b.Length)
    6. fs.Close()
    7. writer.Write("SendFile")
    8. writer.Write(fn)
    9. writer.Write(CInt(b.Length))
    10. writer.Write(b)


    Nun muss ich das, was ich mit der "temp.bmp" gemacht habe, mit der var. "myTreeNodeArray" erreichen...
    Für einen Gedenk-Anstoß würd ich mich freuen!

    LG
    Robin
    Okay, das schaut schon mal gar nicht so schlecht aus!
    Habe ein wenig rumprobiert, aber komme noch auf keinen Gründen zweig!

    Bis jetzt bin ich so weit:

    VB.NET-Quellcode

    1. Dim myTreeNodeArray(TreeView1.Nodes.Count - 1) As TreeNode
    2. TreeView1.Nodes.CopyTo(myTreeNodeArray, 0)
    3. Dim MS As MemoryStream = New MemoryStream
    4. Dim bf As New BinaryFormatter(Nothing, New StreamingContext(StreamingContextStates.Other))
    5. bf.Serialize(MS, myTreeNodeArray)
    6. Dim b(MS.Length - 1) As Byte
    7. writer.Write("SendTree") ' Aktion
    8. writer.Write("TreeNode") 'Name
    9. writer.Write(CInt(MS.Length - 1)) ' Länge
    10. 'writer.Write() ' Bytes <<<<<<<<<<<<<<<<


    Nun wie bekomme ich nun die Bytes in mein BinaryWriter?

    LG
    Robin
    imo brauchst du weder ein Array, noch einen BinaryWriter, noch einen MemoryStream.
    Einfach alle Nodes mittm Formatter in den Stream serialisieren, wos letztendlich rein soll
    Also nicht in den Memorystream, sondern da, wo dein writer-Dingens reinschreibt, da kann auch gleich der Formatter reinschreiben.
    Wie meinst du das?
    mein Ziel ist es ja, den inhalt eines TreeViews (Die Nodes) in das TreeView auf einem anderen Rechner zu bekommen. (Vom Server zum Client)
    Also brauche ich doch zwangsläufig auch einen BinaryReader/Writer? Oder verstehe ich da grad was falsch?
    Hallo,

    Vielen Dank erst mal für die ratschläge!

    Nun wenn ich es nun korrekt interpretiert habe, was du meintest, wär es also so Korrekt?

    VB.NET-Quellcode

    1. Dim myTreeNode(TreeView1.Nodes.Count - 1) As TreeNode
    2. TreeView1.Nodes.CopyTo(myTreeNode, 0)
    3. Dim bf As New System.Runtime.Serialization.Formatters.Binary.BinaryFormatter()
    4. bf.Serialize(socketStream, myTreeNode)
    5. writer.Write("SendTree")
    6. writer.Write("TreeNode") 'Name
    7. writer.Write(CInt(myTreeNode.Length)) ' Länge


    SocketStream ist ein NetworkStream

    VB.NET-Quellcode

    1. For Each nd In TreeView1.Nodes
    2. bf.Serialize(socketStream, nd)
    3. Next
    Ach - aber vlt. geht deins ja auch, denn das Array ist ja auch serialisierbar.
    Vlt ist das sogar besser, weil mit dem Array weiß die Gegenstelle gleich, wieviele Nodes übertragen werden.

    Nur die Zeilen 6 - 8 findich noch nicht ganz überzeugend ;)
    OKay - also ich hab es nun so vor mir...

    VB.NET-Quellcode

    1. Dim myTreeNode(TreeView1.Nodes.Count - 1) As TreeNode
    2. TreeView1.Nodes.CopyTo(myTreeNode, 0)
    3. writer.Write("SendTree")
    4. writer.Write(myTreeNode.Count) 'Node Count
    5. writer.Write(CInt(myTreeNode.Length)) ' Länge
    6. Dim bf As New System.Runtime.Serialization.Formatters.Binary.BinaryFormatter()
    7. bf.Serialize(socketStream, myTreeNode)


    Wie mache ich es nun auf der Client-Seite sprich wo das TreeView gefüllt werden soll?
    Also writer ist ein BinaryWriter wo ich ihm sage welche Daten (SendTree) er nun bekommen soll.
    Bei der Datei-Übertragung hatte ich es nun so gemacht, das ich ihm gesagt den Dateinamen, die länge und dann die Bytes übertragen.
    Auf der gegnseite dementsprechend verarbeiter:

    VB.NET-Quellcode

    1. If theRequest = "SendFile" Then
    2. Dim fn As String = reader.ReadString()
    3. Dim l As Integer = reader.ReadInt32()
    4. Dim b() As Byte = reader.ReadBytes(l)
    5. Dim fs As New FileStream(fn, FileMode.Create, _
    6. FileAccess.Write, FileShare.None)
    7. fs.Write(b, 0, l)
    8. fs.Close()
    9. End If


    Nun muss ich das wiederum umschreiben, das am ende ich ein gefülltes TreeView haben...
    deserialisieren ist mir klar, nur ich stelle mir gead die Frage da ich die Info-Daten/Header wie auch immer über den BinaryWriter rüber schiebe ich nun die daten direkt aus dem NetworkStream heraus nehmen kann um damit dann das TreeView zu befüllen?
    Serialisierung an sich braucht keinen Header - ein serialisiertes Treenode-Array enthält alle Informationen, um sich wieder korrekt zurückzuverwandeln.
    Wenn du für deine Anwendung da einen Header brauchst - kann ich nix zu sagen.
    Mir fällt nur auf, dass in deim EmpfängerCode alles mögliche auftaucht, nur kein BinaryFormatter.
    Da ist Deserialiseren natürlich schlecht.
    Halli Hallo!

    Ja also.. der EmpfängerCode war für meinen versuch, die temp.bmp zu empfangen, und zu speichern...
    Nun ich hab noch nicht so die vorstellung wie ich die Daten aus dem NetworkStream wieder zusammen setze, wird ja nicht so wie in meinem beispiel für meine "temp.bmp" sein..
    Also erst mal muss ich ja die ganzen Bytes lesen, und zusammen setzen?
    Dann Deserialisieren?
    Dann mit den Deserialisierten Daten mein Client-TreeView füttern?
    Sehe ich das so korrekt?
    Wie fange ich das am besten an also das ich erst mal die ganzen Daten zusammen habe?
    Okay wär das nun auch geklärt...
    Nun habe ich die Gesendeten Daten immer über den BinaryReader gelesen.. das habe ich gemacht, wie oben gesehn..
    nun habe ich ja im server die Bytes direkt über den NetworkStream gesendet..

    Nun wie greife ich diese daten wieder am Client ab via NetworkStream?

    VB.NET-Quellcode

    1. output = client.GetStream()


    Nun steht mir ja "output.ReadByte()" oder "output.Read()" zur freien verfügung...
    Okay - Danke für den Tipp, die BinaryFormatter-Klasse hatte ich mir dennoch angeschaut und studiert..
    Ich bin allerdings im Client noch gar nicht so weit... Ich muss ja erst mal daten zum Deserialisieren haben, oder nicht? Verstehe ich da etwas falsch?