myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
   » Plugin für Firefox
   » Plugin für IE7
   » Gadget für Vista
» Regeln
» Wie poste ich richtig?
» Datenschutzerklärung
» wbb-FAQ

Mitglieder
» Liste / Suche
» Karte / Anleitung dazu
» Stadt / Anleitung dazu
» Wer ist wo online?

Angebote
» ASP.NET Webspace
» Bücher
» Zeitschriften
   » dot.net magazin
   » visual studio one
» Accessoires

Ressourcen
» .NET-Glossar
» guide to C#
» openbook: C#
» openbook: Visual C#
» openbook: OO
» .NET BlogBook
» MSDN Webcasts
» dotnetjob.de
» Search.Net

Team
» Übersicht
» Wir über uns
» Bankverbindung
» Impressum

» Unsere MiniCity
MiniCity

» Anzeigen
» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Entwicklung » Basistechnologien und allgemeine .NET-Klassen » MemoryStream zu string und wieder retour...
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | An Freund senden | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

MemoryStream zu string und wieder retour...

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
norman_timo norman_timo ist männlich
myCSharp.de-Poweruser/ Experte

images/avatars/avatar-1775.jpeg

Dabei seit: 13.07.2004
Beiträge: 4.507
Entwicklungsumgebung: .NET 2.0/3.5 und VS2005/VS2008
Herkunft: Wald-Michelbach (Odw)


norman_timo ist offline Blog von norman_timo

MemoryStream zu string und wieder retour...

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo C# Fans!

Ich habe ein skurilles Problem:

Zur Versendung instanziierter Objekte via WebService serialisiere ich diese und verschicke sie als string zum Client.

Das geschieht folgendermaßen:

C#-Code:
        public static string SerializeBinary(object request)
        {
            string theString = "";

            System.Runtime.Serialization.Formatters.Binary.BinaryFormatter serializer =
                new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
            System.IO.MemoryStream memStream = new System.IO.MemoryStream();
            serializer.Serialize(memStream, request);

            // convert memory stream to string
            memStream.Position=0;
            using (System.IO.StreamReader sr = new System.IO.StreamReader(memStream) )
            {
                theString = sr.ReadToEnd();
                // Close and clean up the StreamReader
                sr.Close();
            }

            // return xml string
            return theString;
        }

Mit dieser Methode erhalte ich von dem entsprechenden Objekt einen serialisierten String.

Problem taucht dann aber beim Client auf. Ich bekomme es nicht geregelt, diesen String wieder in ein MemoryStream zu wandeln um mit serializer.Deserialize(memStream); den deserialisierungsprozess anzuschmeissen :-(


Wie wandle ich den String um und übergebe ihn der Deserialize() Funktion? Konkretes Problem:
Wenn ich einen MemoryStream aus dem String ertstelle, dann ist er geschlossen, und es gibt einen Laufzeitfehler, oder ich schließe ihn nach der Verarbeitung, dann meldet aber Deserialize() dass ein unerwartetes Ende im Stream aufgetreten ist ???

ODER: vielleicht gibt es eine andere Art und Weise aus dem String wieder ein instanziiertes Objekt zu machen?


Für Hilfe wäre ich sehr dankbar,

Norman-Timo
26.07.2005 08:51 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
herbivore
myCSharp.de-Team (Admin)

images/avatars/avatar-2627.gif

Dabei seit: 11.01.2005
Beiträge: 42.184
Entwicklungsumgebung: csc/nmake (nothing is faster)
Herkunft: Berlin


herbivore ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo norman_timo,

du brauchst nichts in String umzuwandeln. Du musst nur den Stream wieder an den Anfang zurückspulen, bevor du deserialisierst. Ich denke es gibt eine Seek-Methode oder eine Position-Eigenschaft dafür - habe aber gerade die Doku nicht zur Hand.

herbivore
26.07.2005 09:09 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
norman_timo norman_timo ist männlich
myCSharp.de-Poweruser/ Experte

images/avatars/avatar-1775.jpeg

Dabei seit: 13.07.2004
Beiträge: 4.507
Entwicklungsumgebung: .NET 2.0/3.5 und VS2005/VS2008
Herkunft: Wald-Michelbach (Odw)

Themenstarter Thema begonnen von norman_timo

norman_timo ist offline Blog von norman_timo

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Jo, das ist prinzipiell richtig Herbivore, danke dafür!

Mein Problem ist aber, dass ich das Objekt via WebService verschicke!

Schicke ich den MemoryStream über SOAP (das geht nämlich nicht) dann bekomme ich nur die Info, an welcher Speicheraddresse und welche Länge das Speicherabbild auf dem Server hat, und das ist auf dem Client nicht zu verwerten.

Deshalb die Umwandlung in einen String, der wird nämlich problemlos via SOAP verschickt, auch weil es sich um einen Standarsdtyp dreht.

Auf dem Client steht also nur der String zur Verfügung.


Oder geht das komfortabler?

Ich bin für jede Idee zu haben und habe vollkommene Programmierhoheit :-)

Ciao
Norman-Timo
26.07.2005 09:20 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
herbivore
myCSharp.de-Team (Admin)

images/avatars/avatar-2627.gif

Dabei seit: 11.01.2005
Beiträge: 42.184
Entwicklungsumgebung: csc/nmake (nothing is faster)
Herkunft: Berlin


herbivore ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo norman_timo,

ok, überzeugt. Doch in einen String wandeln.

Beim Rückwandeln: MemoryStream öffnen (read/write), String reinschreiben (StreamWriter), Stream zurückspulen, deserialisieren.

HTH

herbivore
26.07.2005 09:26 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
FZelle
myCSharp.de-Poweruser/ Experte

Dabei seit: 23.04.2004
Beiträge: 6.420


FZelle ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Du weist schon, das ein WebService eigentlich auch in der Lage ist
jedes serialisierbare Object ohne umwandlung zu empfangen/Verschicken?
26.07.2005 09:36 Beiträge des Benutzers | zu Buddylist hinzufügen
norman_timo norman_timo ist männlich
myCSharp.de-Poweruser/ Experte

images/avatars/avatar-1775.jpeg

Dabei seit: 13.07.2004
Beiträge: 4.507
Entwicklungsumgebung: .NET 2.0/3.5 und VS2005/VS2008
Herkunft: Wald-Michelbach (Odw)

Themenstarter Thema begonnen von norman_timo

norman_timo ist offline Blog von norman_timo

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Jo, auch das hab ich schon probiert:

C#-Code:
            System.IO.MemoryStream memStream = new System.IO.MemoryStream();
            object retValue;

            // convert string to memory stream
            using (System.IO.StreamWriter sw = new System.IO.StreamWriter(memStream))
            {
                sw.WriteLine(theString);

                // convert memory stream to object
                System.Runtime.Serialization.Formatters.Soap.SoapFormatter deserializer =
                    new System.Runtime.Serialization.Formatters.Soap.SoapFormatter();

                memStream.Position=0;
                retValue = deserializer.Deserialize(memStream);

                // Close and clean up the StreamReader
                memStream.Close();
                sw.Close();
            }

Das resultiert in folgender Fehlermeldung:

Zitat:
{"An unexpected end of file parsing NAME has occurred. Line 37, position 2." }

Nu, aber es gibt bei mir in dem String kein Ding wie NAME, ich denke dass er aber irgendwo ein EOS (EndOfStream) erwartet, das er nicht bekommt, weil der Stream noch nicht geschlossen wurde :-(

Schließe ich ihn vorher meckert er, dass er geschlossen ist, und nicht verwenden kann ???

Was mache ich verkehrt?

Norman-Timo


[EDITFreude Sorry, nicht verwirren lassen, dass ich einmal den BinaryFormatter benutzt hab, und jetzt den SOAPFormatter, ich unterstütze BEIDES, pass aber schon auf, dass ich immer nur eine Version beim Server und Client verwende :-)[/EDIT]

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von norman_timo am 26.07.2005 09:44.

26.07.2005 09:43 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
norman_timo norman_timo ist männlich
myCSharp.de-Poweruser/ Experte

images/avatars/avatar-1775.jpeg

Dabei seit: 13.07.2004
Beiträge: 4.507
Entwicklungsumgebung: .NET 2.0/3.5 und VS2005/VS2008
Herkunft: Wald-Michelbach (Odw)

Themenstarter Thema begonnen von norman_timo

norman_timo ist offline Blog von norman_timo

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

@FZelle:

Ja, das versuche ich irgendwie, muss aber sagen, dass ich das Serialisieren selbst in die Hand nehmen möchte, da ich Objekte serialisieren will, OHNE dass Klassen, die vererbt worden sind mitserialisert werden!

Ist es dann immer noch problemlos möglich?

Und wenn wie?

Vielleicht ist das eine Lösung die mir zusagt?

Ciao
Norman-Timo
26.07.2005 09:47 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
norman_timo norman_timo ist männlich
myCSharp.de-Poweruser/ Experte

images/avatars/avatar-1775.jpeg

Dabei seit: 13.07.2004
Beiträge: 4.507
Entwicklungsumgebung: .NET 2.0/3.5 und VS2005/VS2008
Herkunft: Wald-Michelbach (Odw)

Themenstarter Thema begonnen von norman_timo

norman_timo ist offline Blog von norman_timo

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Trööööt!

Ich bin so blöd :-)))

Naja eigentlich nicht, aber es reimt sich doch so toll :-)

Ich habe den Fehler gefunden:

eine kleine Zeile im Code mehr:

C#-Code:
// ...

sw.Flush();

// ...

schreibt den kompletten String in den MemoryStream und wird somit auch als komplett erkannt!

Jetzt bin ich auf eine andere Fehlermeldung gestoßen:

Zitat:
{"The constructor to deserialize an object of type CPM.Std.Tracking.WebControls.WebTrackingMap was not found." }

aber das ist klar, weil ich dem Objkekt noch nicht erklärt hab, wie es sich deserialisieren soll, das ist eine Kleinigkeit!

Dank allen trotzdem, vielleicht haben andere genau das gleiche Problem?

Ciao
Norman-Timo
26.07.2005 10:06 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
VizOne VizOne ist männlich
myCSharp.de-Poweruser/ Experte

images/avatars/avatar-1563.gif

Dabei seit: 26.05.2004
Beiträge: 1.373
Entwicklungsumgebung: VS 2010


VizOne ist offline Blog von VizOne

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Wäre es in deinem Fall nicht besser, den String als z.B. Base64 zu codieren? Sonst hast du doch die ganzen nicht-druckbaren Zeichen mit drin:

C#-Code:
...
return Convert.ToBase64String(memStream.GetBuffer(), 0, memStream.Length);

Deserialisieren:

C#-Code:
byte[] data = Convert.FromBase64String(theString);
MemoryStream ms = new MemoryStream(data);
....

Also nichts mit StreamReader/StreamWriter. Das ganze ist nicht nur einfacher sondern IMHO auch besser für SOAP.


MfG VizOne
26.07.2005 11:06 E-Mail | Website | Beiträge des Benutzers | zu Buddylist hinzufügen
norman_timo norman_timo ist männlich
myCSharp.de-Poweruser/ Experte

images/avatars/avatar-1775.jpeg

Dabei seit: 13.07.2004
Beiträge: 4.507
Entwicklungsumgebung: .NET 2.0/3.5 und VS2005/VS2008
Herkunft: Wald-Michelbach (Odw)

Themenstarter Thema begonnen von norman_timo

norman_timo ist offline Blog von norman_timo

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Yes!

Nochmal um einiges besser!

Das werd ich sofort mit einbauen, weil ich nämlich auch festgestellt hab, dass beim BinaryFormatter er das Problem mit der Übertragung hat (whrscheinlich eben Druckzeichen :-)

Herzlichen Dank, ein wundervoller Beitrag hierzu!

Ciao
Norman-Timo
26.07.2005 11:39 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als 5 Jahre.
Der letzte Beitrag ist älter als 5 Jahre.
Antwort erstellen


© Copyright 2003-2010 myCSharp.de-Team. Alle Rechte vorbehalten. 03.09.2010 03:13