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);
}
}
}