2015-01-21 5 views
0

Я создал прокси-классы службы wcf с ссылкой на службу «visual studio» и я могу связаться с сервисом. Одна из служебных операций возвращает сжатую строку в байте [], которая представляет список элементов.Невозможно десериализовать список объектов с помощью XmlSerializer

ПРОБЛЕМА: я могу распаковать байт [], я могу получить xml из десериализованного байта [], но я НЕ МОЖЕТ десериализовать объекты, я получаю список объектов с пустыми значениями.

здесь XML-строка, я получить от декомпрессии

<?xml version="1.0"?> 
<ArrayOfItem xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
<Item> 
... 
<FieldX> 
.. 
</FieldX> 
</Item> 
</ArrayOfItem> 

ArrayOfItem не класс ... но Деталь:

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.34234")] 
[System.SerializableAttribute()] 
[System.Diagnostics.DebuggerStepThroughAttribute()] 
[System.ComponentModel.DesignerCategoryAttribute("code")] 
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://company.com/")] 
public partial class Item: BaseObjectModel { 

    private bool FieldX; 

    [System.Xml.Serialization.XmlElementAttribute(Order=0)] 
    public bool FieldX{ 
     get { 
      return this.FieldX; 
     } 
     set { 
      this.FieldX= value; 
      this.RaisePropertyChanged("FieldX"); 
     } 
    } 
} 

Моего код

 List<Item> lista = null; 
     MemoryStream InStream = new MemoryStream(byteData); 

     GZipStream gzDecompressed = new GZipStream(InStream, CompressionMode.Decompress, true); 

     MemoryStream OutStream = new MemoryStream(); 

     //Retrieve the size of the decompressed file from the compressed footer 

     byte[] bufferWrite = new byte[4]; 

     InStream.Position = (int)InStream.Length - 4; 

     InStream.Read(bufferWrite, 0, 4); 

     InStream.Position = 0; 

     //Convert to int for using in declaring our Byte[] size 

     int bufferLength = BitConverter.ToInt32(bufferWrite, 0); 

     //1MB Buffer 

     byte[] buffer = new byte[1024 * 1024]; 

     while (true) 
     { 

      int bytesRead = gzDecompressed.Read(buffer, 0, buffer.Length); 



      // If we reached the end of the data 

      if (bytesRead == 0) break; 

      OutStream.Write(buffer, 0, bytesRead); 

     } 

     // Close the streams 

     InStream.Close(); 

     gzDecompressed.Close(); 

     OutStream.Position = 0; 

     var sr = new StreamReader(OutStream); 
     string myStr = sr.ReadToEnd(); 

     OutStream.Position = 0; 



     XmlSerializer serializer = new XmlSerializer(typeof(List<Item>)); 
     XmlReader read = XmlReader.Create(OutStream); 
     List<Item> lista2 = (List<Item>)serializer.Deserialize(read); 

Строка это только для того, чтобы узнать, что дает служба, я использую поток памяти для десериализации.

получить список с правильным номером пункта, но каждый элемент имеет пустые свойства ....

Любая помощь приветствуется, спасибо.

EDIT

Я попытался сериализации список с помощью объекта Item прокси и я вижу, что XML имеет кодировку

XML-от службы

<?xml version="1.0"?><ArrayOfItem xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><Item>... 

XML-сериализованная мной

<?xml version="1.0" encoding="utf-16"?><ArrayOfItem xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><Item xmls="company.com"> 

ответ

1

Самый простой способ диагностики этой проблемы - просто сериализовать фиктивный список ваших объектов и посмотреть на полученный XML, а затем сравнить его с тем, что вы пытаетесь десериализовать.

После того как вы сериализуете его, вы узнаете, что XML-библиотека сериализации ожидает, что XML будет выглядеть на основе ваших аннотаций.

Кстати, вам не нужно вводить «Атрибут» в «XmlElementAttribute» ... C# «знает» об этом общем шаблоне именования.

+0

Хорошо, я сделал это, я обновил сообщение – Alessandro