这是我的旧类图(简化)。
public class Main
Public Property ListOfA As ClassACollection
End Class
Public Class ClassBase
End Class
Public Class ClassA
Inherits ClassBase
End Class
Public Class ClassACollection
Inherits System.Collections.ObjectModel.Collection(Of ClassA)
End Class
Public Class ClassB
Inherits ClassBase
End Class
Public Class ClassBCollection
Inherits System.Collections.ObjectModel.Collection(Of ClassB)
End Class
当我用我序列化类Main
时,DataContractSerializer
我得到了这样的 XML:
<Main>
<ListOfA>
<ClassA>
.....
</ClassA>
<ClassA>
.....
</ClassA>
</ListOfA>
</Main>
最近我删除了ClassA
,ClassB
因为它们是相同的!我删除了这两个集合以替换它们:
public class Main
Public Property ListOfA As ClassBaseCollection
End Class
Public Class ClassBaseCollection
Inherits System.Collections.ObjectModel.Collection(Of ClassBase)
End Class
但是现在当我尝试反序列化 XML 时,集合ListOfA
已创建但始终为空!在反序列化过程中我没有收到错误。
我尝试使用 a DataContractResolver
,但该函数ResolveName
从不调用ClassA
or ClassB
。
Dim dc As New Runtime.Serialization.DataContractSerializer(GetType(Main), Nothing, Integer.MaxValue, False, True, Nothing, New MyResolver())
Private Class MyResolver
Inherits Runtime.Serialization.DataContractResolver
Public Overrides Function ResolveName(typeName As String, typeNamespace As String, declaredType As System.Type, knownTypeResolver As System.Runtime.Serialization.DataContractResolver) As System.Type
If typeName.Equals("ClassA") OrElse typeName.Equals("ClassB") Then
Return GetType(ClassBase)
Else
'Defer to the known type resolver
Return knownTypeResolver.ResolveName(typeName, typeNamespace, Nothing, Nothing)
End If
End Function
End Class
是DataContractResolver
做我想做的事的好方法吗?如果是,我还需要其他东西来完成这项DataContractResolver
工作吗?
谢谢你的帮助!
更新:
我添加回来ClassA
并ClassB
在我的项目中进行以下测试:
- 我试图将它们作为已知数据类型放在DataContractSerializer
构造函数中。- 我在 ClassBaseCollection 上
试过了。KnownTypeAttribute
在这 2 种情况下,ResolveName
仍然不要求ClassA
和ClassB
。
我尝试使用从函数派生的类IDataContractSurrogate
并转换函数中的类型,GetDataContractType
并且该函数不调用ClassA
and ClassB
。
更新#2: 最后,我没有找到任何方法来做我想做的事。在序列化之前,我需要查看文件版本并用 XML 中的新标签替换旧标签。前任。:
data = data.Replace("<ClassA>", "<ClassBase>")
...
这不是我第一个问题的答案,而是一种解决方法。