2010-02-17 2 views
5

Ich habe eine Person Objekt und muss es als Byte speichern [] und wieder abrufen dieses Byte [] und zu Person Objekt konvertieren und BinaryFormatter ist availabe nicht in Silverkonvertieren Objekt (dh jedes Objekt wie Person, Mitarbeiter) zu Byte [] in Silverlight

+0

Ich habe das gleiche Problem beim Konvertieren einer bestehenden Winforms App zu Silverlight. Die bestehende Funktion mit den unzulässigen Funktionen AllocHGlobal und FreeHGlobal ist: public static byte [] RawSerialize (object irgendetwas) { int rawsize = Marshal.SizeOf (alles); IntPtr Puffer = Marshal.AllocHGlobal (Rawsize); Marshal.StructureToPtr (alles, Puffer, falsch); byte [] rawdatas = neues Byte [rawsize]; Marshal.Copy (Puffer, Rawdatas, 0, Rawsize); Marshal.FreeHGlobal (Puffer); Rückkehr Rawdatas; } – Jeffrey

Antwort

-1

verwenden serialisierte Klasse das Objekt in ein Byte über unter Verwendung eines Memory

 
using System.Runtime.Serialization.Formatters.Binary; 
using System.Runtime.Serialization; 

.... 
byte[] bPersonInfo = null; 
using (MemoryStream mStream = new MemoryStream()) 
{ 
    System.Runtime.Serialization.Formatters.Binary.BinaryFormatter bf = new BinaryFormatter(); 
    bf.Serialize(mStream, personInfo); 
    bPersonInfo = mStream.ToArray(); 
} 
.... 
// Do what you have to do with bPersonInfo which is a byte Array... 

// To Convert it back 
PersonInfo pInfo = null; 
using (MemoryStream mStream = new MemoryStream(bPersonInfo)){ 
    System.Runtime.Serialization.Formatters.Binary.BinaryFormatter bf = new BinaryFormatter(); 
    pInfo = (PersonInfo)bf.DeSerialize(mStream); 
} 
// Now pInfo is a PersonInfo object. 

hoffe, das hilft, mit freundlichen Grüßen, Tom zu konvertieren.

+4

Danke Tom, Der BinaryFormatter ist in SilverLight nicht verfügbar –

+0

Ich bin nicht sicher, warum die upvotes hier sind - es scheint nicht, dass der Namespace Formatters in Silverlight verfügbar ist. Oder fehlt mir etwas? – Jeffrey

+0

Diese Lösung funktioniert nicht mit SL – rboarman

2

Ich habe XML-Serializer verwendet, um das Objekt in eine Zeichenfolge zu konvertieren, und sie konvertieren die Zeichenfolge in Silverlight erfolgreich in Byte [].

object address = new Address(); 

      System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(typeof(Address)); 
      StringBuilder stringBuilder = new StringBuilder(); 
      using (StringWriter writer = new StringWriter(stringBuilder)) 
      { 
       serializer.Serialize(writer, address); 
      } 

      System.Text.UTF8Encoding encoding = new System.Text.UTF8Encoding(); 
      byte[] data = encoding.GetBytes(stringBuilder.ToString()); 
6

Da die von t0mm13b genannte Namespaces nicht Teil der Silverlight .NET-Engine ist, ist der richtige Weg, um diese Abhilfe zu verwenden, um den Datenvertrag Serializer Nutzung:

http://forums.silverlight.net/forums/t/23161.aspx

Von Link :

string SerializeWithDCS(object obj) 
{ 
    if (obj == null) throw new ArgumentNullException("obj"); 
    DataContractSerializer dcs = new DataContractSerializer(obj.GetType()); 
    MemoryStream ms = new MemoryStream(); 
    dcs.WriteObject(ms, obj); 
    return Encoding.UTF8.GetString(ms.GetBuffer(), 0, (int)ms.Position); 
} 
0

Blick auf individuelle binäre Serialisierung und Kompressionhere

und here

4

Wenn Sie wirklich binär brauchen und wollen es super schnell und sehr klein sein, dann sollten Sie protobuf von Google verwenden.

http://code.google.com/p/protobuf-net/

Sehen sie sich diese Performance-Zahlen. Protobuf ist weit und weg der schnellste und kleinste.

enter image description here

ich verwendet habe, es für WCF < -> Silverlight mit Erfolg und würde nicht zögern, es für ein neues Projekt wieder zu verwenden.

Verwandte Themen