Laden...

Deserialize aus Memorystream wirft Fehler wegen nicht erreichtem Datenstromende

Erstellt von troubleinformatics vor 6 Jahren Letzter Beitrag vor 6 Jahren 3.506 Views
T
troubleinformatics Themenstarter:in
3 Beiträge seit 2017
vor 6 Jahren
Deserialize aus Memorystream wirft Fehler wegen nicht erreichtem Datenstromende

Hey,

ich habe ein Problem bei meinem Code.

Ich habe ein DataSet über TCP von der Server Anwendung Serialisiert und dann zum Client übertragen. Nun bekomme ich den folgenden Fehler, wenn ich es Deserialisieren möchte.

Fehlermeldung:
Fehler: "Das Datenstromende wurde erreicht, bevor die Verarbeitung abgeschlossen wurde."
"SerializationException wurde nicht behandelt"

Code:

static public object DeserializeData(string value)
        {
            MemoryStream ms = new MemoryStream(Convert.FromBase64String(value));
            BinaryFormatter bf1 = new BinaryFormatter();
            ms.Position = 0;
            
            
            return (DataSet)bf1.Deserialize(ms);  // <--- Zeile in dem der Fehler auftritt
        }
while ((k = stream.Read(data, 0, data.Length)) > 0)
            {
                string wert = System.Text.Encoding.ASCII.GetString(data, 0, k);
                DataSet ds = (DataSet)DeserializeData(wert);//<--- Aufruf der Methode

Wo liegt da ein Fehler vor?

Vielen Dank für eure Hilfe!

Vielen Dank für jede Antwort 🙂

3.003 Beiträge seit 2006
vor 6 Jahren

Zeig mal den Code der Gegenseite. Kommt mir bisschen spanisch vor, was du da machst 😃

LaTino

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

D
985 Beiträge seit 2014
vor 6 Jahren

Das passiert wenn du das Gesamt-Paket in Teilen geliefert bekommst.

Folglich musst du erst das Gesamt-Paket empfangen und dann mit der Deserialisierung beginnen.

T
troubleinformatics Themenstarter:in
3 Beiträge seit 2017
vor 6 Jahren
 public string SerializeData(Object o)
        {
            MemoryStream ms = new MemoryStream();
            BinaryFormatter bf1 = new BinaryFormatter();
            bf1.Serialize(ms, o);
            return Convert.ToBase64String(ms.ToArray());
        }

Spanisch kann ich eigentlich nicht 😃

Vielen Dank für jede Antwort 🙂

D
985 Beiträge seit 2014
vor 6 Jahren

Debuggen kannst du?

Dann schau dir an wieviele Bytes du verschickst und wieviele Bytes du zum Deserialisieren bekommst.

709 Beiträge seit 2008
vor 6 Jahren

Folgender Code funktioniert:

    class Program {
        static void Main(string[] args) {
            MyClass obj = new MyClass {
                MyProperty = 1,
                MyProperty2 = "zwei",
                MyProperty3 = Math.PI
            };

            string data = SerializeData(obj);

            MyClass obj2 = DeserializeData<MyClass>(data);

            DataSet dataSet = new DataSet("DataSet1");
            DataTable table = new DataTable("Table1");
            DataColumn col1 = new DataColumn(nameof(obj.MyProperty), obj.MyProperty.GetType());
            DataColumn col2 = new DataColumn(nameof(obj.MyProperty2), obj.MyProperty2.GetType());
            DataColumn col3 = new DataColumn(nameof(obj.MyProperty3), obj.MyProperty3.GetType());

            table.Columns.Add(col1);
            table.Columns.Add(col2);
            table.Columns.Add(col3);

            DataRow row = table.NewRow();
            row[nameof(obj.MyProperty)] = obj.MyProperty;
            row[nameof(obj.MyProperty2)] = obj.MyProperty2;
            row[nameof(obj.MyProperty3)] = obj.MyProperty3;

            table.Rows.Add(row);
            dataSet.Tables.Add(table);

            string data2 = SerializeData(dataSet);

            DataSet dataSet2 = DeserializeData<DataSet>(data2);
        }

        public static string SerializeData(Object o) {
            MemoryStream ms = new MemoryStream();
            BinaryFormatter bf1 = new BinaryFormatter();
            bf1.Serialize(ms, o);
            return Convert.ToBase64String(ms.ToArray());
        }

        public static T DeserializeData<T>(string value) {
            MemoryStream ms = new MemoryStream(Convert.FromBase64String(value));
            BinaryFormatter bf1 = new BinaryFormatter();
            ms.Position = 0;
            return (T)bf1.Deserialize(ms);
        }
    }

    [Serializable]
    class MyClass {
        public int MyProperty { get; set; }

        public string MyProperty2 { get; set; }

        public double MyProperty3 { get; set; }
    }

An dem Teil sollte es also schon mal nicht liegen, denke ich.
Bei einem Fehler hätte ich eher auf die Stelle mit Convert.FromBase64String(value) getippt, da dann noch nicht genug Daten aus dem Stream gelesen worden wären.

3.003 Beiträge seit 2006
vor 6 Jahren

Bei einem Fehler hätte ich eher auf die Stelle mit Convert.FromBase64String(value) getippt, da dann noch nicht genug Daten aus dem Stream gelesen worden wären.

Genau die Stelle, die mir seltsam vorkam. Das[EDIT]Base64-Codierung[/EDIT] sollte zum Versenden eigentlich nicht nötig sein.

LaTino

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

D
985 Beiträge seit 2014
vor 6 Jahren

Convert.FromBase64String(value)
Das sollte zum Versenden eigentlich nicht nötig sein.

Wird zum Versenden auch gar nicht genommen 😉

T
troubleinformatics Themenstarter:in
3 Beiträge seit 2017
vor 6 Jahren

Danke für alle Antworten.

Habe das Problem jetzt gelöst.

Ich habe das Paket in ganzem Übertragen lassen und schwupp hat es funktioniert.

Dankeschön 😃

Vielen Dank für jede Antwort 🙂