将C#字节数组转换为Object Threw SerializationException

时间:2014-10-08 07:03:18

标签: c# soap xamarin dataset bytearray

我正在使用Xamarin开发一个iOS项目,它使用C#进行.NET(SOAP)Web服务和iOS。我试图以字节数组的形式从Web服务发送DataSet对象到移动设备。我使用following代码转换为/从字节数组:

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;
}

然而,当我尝试将字节数组转换回从WebService发送到移动设备的DataSet时,我得到了一个异常'意外的二进制元素:101'来自' Deserialize'方法。我尝试了以下但仍然无法弄清楚:

  1. 将DataSet转换为byte []并在WebService中转换回DataSet,它可以正常工作
  2. 将DataSet转换为byte []并在移动设备中转换回DataSet,它可以正常工作
  3. 我调试并检查了当从WebService发送时以及在移动设备上接收时,字节数组长度和前几个字节是相同的。
  4. 任何人都有通过SOAP Web服务发送byte []的任何线索或经验吗?

    提前致谢!

1 个答案:

答案 0 :(得分: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