我使用" 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">
答案 0 :(得分:1)
诊断此问题的最简单方法是简单地序列化对象的虚拟列表,查看生成的XML,然后将其与您尝试反序列化的内容进行比较。
序列化后,您将根据注释了解XML序列化库对XML的期望。
顺便说一下,你不需要键入&#34;属性&#34;在&#34; XmlElementAttribute&#34; ... C#&#34;知道&#34;关于这种常见的命名模式。