2010-02-17 35 views
5

我有一個人對象,並需要將其存儲爲字節[],再次檢索的byte [],並轉換爲個人對象 和BinaryFormatter的是通過使用一個MemoryStream轉換對象(即像人,僱員的任何對象)爲byte []在Silverlight

 
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. 

希望這有助於 最好的問候, 湯姆在Silverlight

+0

我有在現有的WinForms應用程序轉換爲Silverlight的同樣的問題。具有非法功能的現有函數AllocHGlobal和FreeHGlobal是: public static byte [] RawSerialize(object anything) { int rawsize = Marshal.SizeOf(anything); IntPtr buffer = Marshal.AllocHGlobal(rawsize); Marshal.StructureToPtr(anything,buffer,false); byte [] rawdatas = new byte [rawsize]; Marshal.Copy(buffer,rawdatas,0,rawsize); Marshal.FreeHGlobal(buffer); Marshal.FreeHGlobal(buffer); return rawdatas; } – Jeffrey 2011-05-13 17:12:50

回答

-1

使用不速效序列化類對象轉換爲字節。

+4

謝謝湯姆, BinaryFormatter不可用SilverLIght – 2010-02-19 12:58:51

+0

我不確定爲什麼upvotes在這裏 - 它似乎並沒有格式化名稱空間在Silverlight中可用。或者我錯過了什麼? – Jeffrey 2011-05-13 17:22:49

+0

該解決方案不適用於SL – rboarman 2011-05-14 17:05:39

2

我已經使用XML序列化對象轉換爲字符串,並將其轉換成字符串爲byte []成功地在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

因爲t0mm13b提到的命名空間是不是Silverlight的.NET引擎的一部分,正確的方法是使用此解決方案利用數據合同串行:

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

從鏈接:

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

定製的二進制序列化和壓縮here

here

4

如果你真的需要二進制和希望它是超級快和非常小的,那麼你應該使用的protobuf來自谷歌。

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

看看這些性能數字。 Protobuf遙遙領先,速度最快,最小。

enter image description here

我已經使用了WCF < - > Silverlight的成功,並會毫不猶豫地使用它的一個新項目。