2014-10-08 57 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