DataContractSerializer不能很好地反序列化为Struct

时间:2018-10-24 08:23:08

标签: c# .net serialization datacontractserializer serializer

无法将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的客户端-服务器通信中发现。上面的代码是在我隔离问题之后。

0 个答案:

没有答案