2014-10-08 91 views
0

我正在開發一個使用Xamarin的iOS項目,它使用C#.NET(SOAP)Web服務和iOS。我試圖從Web服務發送DataSet對象到字節數組形式的移動。我用following代碼轉換到/從字節數組:將C#字節數組轉換爲對象拋出SerializationException

public static byte[] ConvertObjectToByteArray(Object obj) 
{ 
    if (obj == null) 
     return null; 
    BinaryFormatter bf = new BinaryFormatter(); 
    if (obj.GetType() == typeof(DataSet)) 
    { 
     DataSet ds = (DataSet)obj; 
     ds.RemotingFormat = SerializationFormat.Binary; 
    } 
    using (MemoryStream ms = new MemoryStream()) 
    { 
     bf.Serialize(ms, obj); 
     return ms.ToArray(); 
    } 
} 

public static Object ConvertByteArrayToObject(byte[] byteArr) 
{ 
    Object resultObj; 
    BinaryFormatter bf = new BinaryFormatter(); 
    using (MemoryStream ms = new MemoryStream(byteArr)) 
    { 
     ms.Seek(0, SeekOrigin.Begin); 
     resultObj = (Object) bf.Deserialize(ms); 
     ms.Close(); 
    } 
    return resultObj; 
} 

然而,當我嘗試字節數組轉換回從web服務發送到移動數據集,我有個例外「意外二進制元素:101」從'反序列化'方法。我嘗試以下,但仍無法弄清楚:

  1. 轉換數據集爲byte []和轉換回數據集的WebService,它工作正常
  2. 轉換數據集爲byte []和轉換回數據集移動,它工作正常
  3. 我調試並檢查字節數組的長度和前幾個字節是相同的,當從WebService發送和移動時收到。

任何人都有任何線索或經由SOAP Web服務發送byte []的經驗?

在此先感謝!

+1

這可能發生,因爲這兩個可能會把手(反)序列略有不同。或者僅僅是因爲其中一個有bug(假設這裏是Mono)。無論如何,嘗試使用非二進制序列化來開始看看會發生什麼。您仍然可以將XML文本轉換爲二進制文件。 – 2014-10-08 07:22:35

回答

0

我設法找到辦法解決這個使用其他序列化功能如下:

private byte[] Compress(DataSet dataset) 
{ 
    Byte[] data; 
    MemoryStream mem = new MemoryStream(); 
    GZipStream zip = new GZipStream(mem, CompressionMode.Compress); 
    dataset.WriteXml(zip, XmlWriteMode.WriteSchema); 
    zip.Close(); 
    data = mem.ToArray(); 
    mem.Close(); 
    return data; 
} 

private DataSet Decompress(Byte[] data) 
{ 
    MemoryStream mem = new MemoryStream(data); 
    GZipStream zip = new GZipStream(mem, CompressionMode.Decompress); 
    DataSet dataset = new DataSet(); 
    dataset.ReadXml(zip, XmlReadMode.ReadSchema); 
    zip.Close(); 
    mem.Close(); 
    return dataset; 
} 

感謝這個post