Serialization: Objekt als byte[] Array



  • Ich möchte mein Objekt ChatMessage als byte[] Array - anschließend möchte ich aus dem byte[] Array wieder ein ChatMessage Objekt machen:

    using System;
    using System.IO;
    using System.Runtime.Serialization;
    using System.Runtime.Serialization.Formatters.Binary;
    
    namespace Ü2
    {
    	[Serializable()]
    	class ChatMessage
    	{
    		public ChatMessage(string message)
    		{
    			m_Message = message;
    		}
    
    		public string Message
    		{
    			get {return m_Message;}
    		}
    
    		string m_Message;
    	}
    
    	class Class1
    	{
    		static void Main(string[] args)
    		{
    			ChatMessage obj = new ChatMessage("Hallo Welt!");
    
    			BinaryFormatter formatter = new BinaryFormatter();
    			Stream stream = new MemoryStream();
    			formatter.Serialize(stream, obj);
    			byte[] data = new byte[stream.Length];
    			stream.Read(data, 0, (int)stream.Length);
    			stream.Close();
    
    			Stream stream2 = new MemoryStream();
    			stream2.Write(data, 0, data.Length);
    			obj = (ChatMessage)formatter.Deserialize(stream2);
    
    			System.Console.WriteLine(obj.ToString());
    		}
    	}
    }
    

    irgendetwas läuft schief

    An unhandled exception of type 'System.Runtime.Serialization.SerializationException' occurred in mscorlib.dll

    Additional information: Das Streamende wurde erreicht, bevor die Verarbeitung abgeschlossen wurde.



  • An welcher Stelle wird die Ausnahme geworfen? Gib mal einen StackTrace...



  • die Ausnahme kommt an folgender Stelle:

    obj = (ChatMessage)formatter.Deserialize(stream2);
    

    was ist ein StackTrace?

    System.Console.WriteLine(Environment.StackTrace.ToString());
    

    liefert:

    C:\Dokumente und Einstellungen\julian\Desktop\Ü2\bin\Debug>Ü2.exe
    at System.Environment.GetStackTrace(Exception e)
    at System.Environment.GetStackTrace(Exception e)
    at System.Environment.get_StackTrace()
    at Ü2.Class1.Main(String[] args) in c:\dokumente und einstellungen\julian\des
    ktop\ü2\class1.cs:line 65



  • Es fehlt der Standardconstructor in deinem Beispiel.

    [Serializable()]
        class ChatMessage
        {
    
            public ChatMessage() // <- erforderlich für die Serialisierung
            {
            }
    
            public ChatMessage(string message)
            {
                m_Message = message;
            }
    
            public string Message
            {
                get {return m_Message;}
            }
    
            string m_Message;
        }
    


  • kann mir nicht vorstellen, das es am Standardkonstruktor liegt... hab meiner Klasse einen spendiert, aber es geht immer noch nicht

    [Serializable()] 
    	class ChatMessage 
    	{ 
    		public ChatMessage()
    		{
    		}
    		public ChatMessage(string message) 
    		{ 
    			m_Message = message; 
    		} 
    
    		public string Message 
    		{ 
    			get {return m_Message;} 
    		} 
    
    		string m_Message; 
    	} 
    
    	class Class1 
    	{ 
    		static void Main(string[] args) 
    		{ 
    			ChatMessage obj = new ChatMessage("Hallo Welt!"); 
    
    			BinaryFormatter formatter = new BinaryFormatter(); 
    			Stream stream = new MemoryStream(); 
    			formatter.Serialize(stream, obj); 
    			byte[] data = new byte[stream.Length]; 
    			stream.Read(data, 0, (int)stream.Length); 
    			stream.Close(); 
    
    			Stream stream2 = new MemoryStream(); 
    			stream2.Write(data, 0, data.Length); 
    			obj = (ChatMessage)formatter.Deserialize(stream2); 
    
    			System.Console.WriteLine(obj.ToString()); 
    		} 
    	}
    


  • Die Jungs von Deveel Labs haben mir geholfen:

    using System; 
    using System.IO; 
    using System.Runtime.Serialization; 
    using System.Runtime.Serialization.Formatters.Binary; 
    
    namespace Ü2 
    { 
    	[Serializable] 
    	class ChatMessage 
    	{ 
    		public ChatMessage()
    		{
    		}
    		public ChatMessage(string message) 
    		{ 
    			m_Message = message; 
    		} 
    
    		public string Message 
    		{ 
    			get {return m_Message;} 
    		} 
    
    		string m_Message; 
    	} 
    
    	class Serializer
    	{
    		public static byte[] Serialize(object obj) 
    		{
    			try 
    			{
    				MemoryStream bout = new MemoryStream();
    				BinaryWriter objOut = new BinaryWriter(bout);
    				BinaryFormatter formatter = new BinaryFormatter();
    				formatter.Serialize(objOut.BaseStream,obj);
    				objOut.Close();
    				return bout.ToArray();
    			} 
    			catch (IOException e) 
    			{
    				throw new ApplicationException("Serialization failed: " + e.Message);
    			}
    		}
    
    		public static object Deserialize(byte[] data) 
    		{
    			if (data == null)
    				return null;
    			try 
    			{
    				MemoryStream bin = new MemoryStream(data);
    				BinaryFormatter formatter = new BinaryFormatter();
    				object obj = formatter.Deserialize(bin);
    				bin.Close();
    				return obj;
    			} 
    			catch (IOException e) 
    			{
    				throw new ApplicationException("Deserialization failed: " + e.Message);
    			} 
    			catch (Exception e) 
    			{
    				throw new ApplicationException("Class not found: " + e.Message);
    			}
    		}
    	}
    
    	class Maindsf
    	{
    		public static void Main()
    		{
    			Console.WriteLine("Something");
    
    			ChatMessage msg = new ChatMessage("Hallo Welt!");
    
    			byte[] data = Serializer.Serialize(msg);
    
    			ChatMessage msg2 = (ChatMessage)Serializer.Deserialize(data);
    
    			Console.WriteLine(msg2.Message);
    
    			Console.ReadLine();
    		}
    	}
    
    }
    

    Ab damit in die FAQ 🕶



  • public class Serializer
    {
    public static byte[] SerializeIt(object obj)
    {
    try
    {
    MemoryStream bout = new MemoryStream();
    BinaryWriter objOut = new BinaryWriter(bout);
    BinaryFormatter formatter = new BinaryFormatter();
    formatter.Serialize(objOut.BaseStream,obj);
    objOut.Close();
    return bout.ToArray();
    }
    catch (IOException e)
    {
    throw new ApplicationException("Serialization failed: " + e.Message);
    }
    }

    public static object DeserializeIt(byte[] data)
    {
    if (data == null)
    return null;
    try
    {
    MemoryStream bin = new MemoryStream(data);
    BinaryFormatter formatter = new BinaryFormatter();
    object obj = formatter.Deserialize(bin);
    bin.Close();
    return obj;
    }
    catch (IOException e)
    {
    throw new ApplicationException("Deserialization failed: " +
    e.Message);
    }
    catch (Exception e)
    {
    throw new ApplicationException("Class not found: " + e.Message);
    }
    }
    }


Anmelden zum Antworten