没有 xsi:type 的 DataContractResolver

DataContractResolver without a xsi:type

为了兼容性,我需要将旧的 DataContract-XML 反序列化为具有抽象类型的新模型。

老款老XML

[DataContract]
class OldType {
  [DataMember] public string Hello;
}

List<OldType> serializeMe = new List<~>(){ new OldType(); }
serializer.WriteObject(..., serializeMe);
<OldType>
  <Hello></Hello>
</OldType>

新模型 & XML

[DataContract]
abstract class AbstractType {
 [DataMember] public string Hello;
}

[DataContract]
class NewType : AbstractType {
  // only non serialized fields
}

List<AbstractType> serializeMe = new List<~>(){ new NewType(); }
serializer.WriteObject(..., serializeMe);
<AbstractType i:type="b:NewType" mlns:b="..Namespace">
  <Hello></Hello>
</AbstractType>

显然这不是那样的。我希望使用 DataContractResolver 将旧类型映射到新抽象类型。然而,解析器只对使用 xsi:type 声明的节点调用。 我能想到的最后一种可能性是使用 string.replace,但这太丑陋了。还有更多建议吗?或者我可以将 DataContractResolver 更改为始终被调用吗?

感谢@,我找到了正确的解决方案。 我没有将模型更改为数据,而是添加了一个额外的映射 DTO,并将名称和名称空间映射到旧的。好多了。

[DataContract(Name="OldType")]
class DataContractOldType {
  [DataMember] public string Hello;

  AbstractType MapToCorrectType() { .... }
}