无法使用XmlSerializer反序列化对象列表

时间:2015-01-21 16:28:58

标签: c# wcf deserialization xmlserializer

我使用" visual studio>生成了wcf服务的代理类。服务参考"我可以联系该服务。 其中一个服务操作返回byte []中的压缩字符串,表示项目列表。

问题:我可以解压缩byte [],我可以从反序列化的byte []中获取一个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不是类......但是Item是:

[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);

它只用于查看服务提供的字符串,我使用内存流进行反序列化。

我得到一个包含正确数量项目的列表,但每个项目都有空属性....

感谢任何帮助,谢谢。

修改

我尝试使用代理的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 个答案:

答案 0 :(得分:1)

诊断此问题的最简单方法是简单地序列化对象的虚拟列表,查看生成的XML,然后将其与您尝试反序列化的内容进行比较。

序列化后,您将根据注释了解XML序列化库对XML的期望。

顺便说一下,你不需要键入&#34;属性&#34;在&#34; XmlElementAttribute&#34; ... C#&#34;知道&#34;关于这种常见的命名模式。