为了兼容性,我需要将旧的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更改为始终被调用?
发布于 2021-09-06 16:07:05
感谢@dbc,我找到了正确的解决方案。我只是添加了一个额外的映射DTO,并将名称和名称空间映射到旧的名称和名称空间,而不是将模型更改为数据。好多了。
[DataContract(Name="OldType")]
class DataContractOldType {
[DataMember] public string Hello;
AbstractType MapToCorrectType() { .... }
}https://stackoverflow.com/questions/69044915
复制相似问题