没有 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() { .... }
}
为了兼容性,我需要将旧的 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
更改为始终被调用吗?
感谢@
[DataContract(Name="OldType")]
class DataContractOldType {
[DataMember] public string Hello;
AbstractType MapToCorrectType() { .... }
}