2010-02-17 1 views
5

J'ai un objet personne et j'ai besoin de le stocker comme byte [] et encore récupérer ce byte [] et convertir en objet personne et BinaryFormatter est pas availabe dans silverlightconvertir l'objet (c.-à-d. Tout objet comme personne, employé) à byte [] dans silverlight

+0

J'ai le même problème lors de la conversion d'une application winforms existante en Silverlight. La fonction existante avec des fonctions illégales AllocHGlobal et FreeHGlobal est: public static byte [] RawSerialize (objet quelconque) { int rawsize = Marshal.SizeOf (n'importe quoi); IntPtr buffer = Marshal.AllocHGlobal (taille brute); Marshal.StructureToPtr (n'importe quoi, buffer, false); byte [] rawdatas = nouvel octet [rawsize]; Marshal.Copy (buffer, rawdatas, 0, rawsize); Marshal.FreeHGlobal (tampon); return rawdatas; } – Jeffrey

Répondre

-1

Utilisez la classe sérialisée pour convertir l'objet en un octet via l'aide d'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. 

Hope this helps, Meilleures salutations, Tom.

+4

Merci Tom, Le BinaryFormatter n'est pas disponible dans SilverLIght –

+0

Je ne suis pas sûr de savoir pourquoi les upvotes sont ici - il ne semble pas que l'espace de noms Formatters est disponible dans Silverlight. Ou est-ce que je manque quelque chose? – Jeffrey

+0

Cette solution ne fonctionnera pas avec SL – rboarman

2

J'ai utilisé XML Serializer pour convertir l'objet en une chaîne et les convertir la chaîne à byte [] avec succès dans 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

Parce que les espaces de noms mentionnés par t0mm13b ne font pas partie du moteur .NET Silverlight, la bonne façon est d'utiliser cette solution de contournement tirant parti du contrat de données sérialiseur:

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

À partir du lien :

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

Regardez sérialisation binaire et à la compression sur mesurehere

et here

4

Si vous avez vraiment besoin binaire et que vous voulez qu'il soit super rapide et très petit, alors vous devriez utiliser protobuf de Google.

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

Regardez ces chiffres de performance. Protobuf est de loin le plus rapide et le plus petit.

enter image description here

Je l'ai utilisé pour WCF < -> Silverlight avec succès et ne hésiterais pas à l'utiliser à nouveau pour un nouveau projet.

Questions connexes