2010-02-17 11 views
5

tengo un objeto de persona y necesito almacenarlo como byte [] y recuperar ese byte [] y convertirlo en objeto de persona y BinaryFormatter es no availabe en Silverlightconvertir objeto (es decir, cualquier objeto como persona, empleado) en byte [] en silverlight

+0

Tengo el mismo problema al convertir una aplicación winforms existente a silverlight. La función existente con funciones ilegales AllocHGlobal y FreeHGlobal es: byte estático público [] RawSerialize (object anything) { int rawsize = Marshal.SizeOf (cualquier cosa); IntPtr buffer = Marshal.AllocHGlobal (rawsize); Marshal.StructureToPtr (anything, buffer, false); byte [] rawdatas = new byte [rawsize]; Marshal.Copy (buffer, rawdatas, 0, rawsize); Marshal.FreeHGlobal (buffer); return rawdatas; } – Jeffrey

Respuesta

-1

Utilice la clase serializada para convertir el objeto en un byte a través de uso de un MemoryStream

 
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. 

Espero que esto ayude, saludos, Tom.

+4

Gracias Tom, The BinaryFormatter no está disponible en SilverLIght –

+0

No estoy seguro de por qué los upvotes están aquí; no parece que el espacio de nombre de los formateadores esté disponible en Silverlight. ¿O me estoy perdiendo algo? – Jeffrey

+0

Esta solución no funcionará con SL – rboarman

2

He utilizado XML Serializer para convertir el objeto en una cadena y ellos convierten la cadena en byte [] con éxito en Silverlight.

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

Debido a los espacios de nombres mencionados por t0mm13b no son parte del motor Silverlight .NET, la forma correcta es utilizar esta solución el aprovechamiento de la serializador contrato de datos:

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

Desde el enlace :

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

Mira serialización binaria personalizada y compresiónhere

y here

4

Si realmente necesita binario y quiere que sea muy rápido y muy pequeño, entonces debería usar protobuf de Google.

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

mirada a estas cifras de rendimiento. Protobuf es por lejos el más rápido y el más pequeño.

enter image description here

Lo he utilizado para WCF < -> Silverlight con éxito y no dudaría en volver a utilizarlo para un nuevo proyecto.

Cuestiones relacionadas