這是我的舊類圖(簡化版)。在DataContractSerializer中將已刪除的類型反序列化爲新類型(舊的基類)
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
被創建,但總是空空的!在反序列化過程中我沒有錯誤。
我試過使用DataContractResolver
,但函數ResolveName
從不要求ClassA
或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
工作?
感謝您的幫助!
更新: - 我試圖把它們是已知的數據類型在DataContractSerializer
構造
: 我在我的項目做如下測試,加入背ClassA
和ClassB
。
- 我嘗試了ClassBaseCollection`上的KnownTypeAttribute
。
在這2種情況下,ResolveName
仍然不需要ClassA
和ClassB
。
我試圖用派生的類從IDataContractSurrogate
和轉換類型的功能GetDataContractType
這個功能沒有要求ClassA
和ClassB
。
更新#2: 最後,我沒有發現任何方式做我想要的。我需要查看文件版本,並在序列化之前用XML中的新標籤替換舊標籤。防爆。 :
data = data.Replace("<ClassA>", "<ClassBase>")
...
這不是我的第一個問題的答案,而是一種解決方法。
[Data Contract Versioning](http://msdn.microsoft.com/zh-cn/library/ms731138.aspx)上的msdn頁面可能對您有用。 –