无法将XML反序列化为之前通过序列化 Class 对象而创建的 Struct 。
Struct和Class用相同的字段定义,并用DataMember属性修饰。
这是在服务器上对类进行序列化时发出的XML:
<?xml version="1.0"?>
<CacheItem xmlns="http://schemas.datacontract.org/2004/07/Contracts" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<ProfileID>2</ProfileID>
<CategoryID>3</CategoryID>
<ID>1</ID>
<SeverityID>4</SeverityID>
</CacheItem>
这是Struct的定义:
[DataContract]
public struct CacheItem {
[DataMember(Name = "ID")] public long ID;
[DataMember(Name = "ProfileID")] public long ProfileID;
[DataMember(Name = "CategoryID")] public int CategoryID;
[DataMember(Name = "ServerityID")] public short SeverityID;
}
这是试图将XML反序列化为Struct的代码:
var dcs = new DataContractSerializer(typeof(CacheItem));
using(StreamReader sr = new StreamReader("OutputSerialization.txt", false)) {
using(XmlDictionaryReader xdw = XmlDictionaryReader.CreateTextReader(sr.BaseStream, new XmlDictionaryReaderQuotas())) {
CacheItem p = (CacheItem) dcs.ReadObject(xdw);
}
}
反序列化的实例包含ProfileID字段的正确值为2,其他原始字段的值为0(可能是因为默认值为0)。
当更改XML中字段的顺序,然后反序列化为Struct时,Struct实例将为不同的字段加载正确的值。
好像反序列化为Struct一样,DataContractSerializer的行为也有所不同,因为如果我将CacheItem类型更改为Class,则效果很好。
注意:实际问题已在我们使用WCF的客户端-服务器通信中发现。上面的代码是在我隔离问题之后。