2014-10-08 2 views
0

Я разрабатываю проект iOS с использованием Xamarin, который использует C# для веб-службы .NET (SOAP) и iOS. Я пытаюсь отправить объект DataSet из веб-службы на мобильный в виде массива байтов. Я использовал following код для преобразования в/из байтового массива:Преобразование C# Байт-массив в объект Threw 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; 
} 

Однако, когда я пытаюсь преобразовать массив байтов обратно в DataSet, посылаемого с WebService на мобильный, я получил исключение «Неожиданный двоичный элемент: 101» из метод «Deserialize». Я попытался следующие, но все еще не мог понять:

  1. Преобразование DataSet в байт [] и преобразовать обратно в DataSet в WebService, он работает правильно
  2. Преобразование DataSet в байт [] и преобразовать обратно в DataSet в мобильный, он работает правильно
  3. Я отлаживал и проверял, что длина байтового массива и первые несколько байтов совпадают, когда они будут отправлены из WebService и получены на мобильном устройстве.

У кого-нибудь есть какие-либо подсказки или опыт отправки байта [] через SOAP-веб-сервис?

Заранее благодарен!

+1

Это могло произойти потому, что два может обрабатывать (де) сериализации немного по-другому. или просто потому, что один из них имеет ошибку (предполагая здесь Mono). Во всяком случае, попробуйте пойти с не двоичной сериализацией, чтобы начать видеть, что происходит. Вы все равно можете преобразовать XML-текст в двоичный. –

ответ

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

Смежные вопросы