2016-04-23 61 views
0

Windows 10通用應用程序。 VB類別引起錯誤的序列化

我有我想保存到文件並從文件中讀取的類,保存工程,但是當我嘗試加載時出現錯誤。

消息=第1行位置249錯誤。元素'http://schemas.datacontract.org/2004/07/KoW_Universal_v2:MagicItem'包含'http://schemas.microsoft.com/2003/10/Serialization/Arrays:ArrayOfKeyValueOfstringMagicItemyoeMIiQz'數據合約的數據。反序列化器不知道映射到此合約的任何類型。將與'ArrayOfKeyValueOfstringMagicItemyoeMIiQz'對應的類型添加到已知類型列表中 - 例如,使用KnownTypeAttribute屬性或將其添加到傳遞給DataContractSerializer的已知類型列表中。 源= System.Private.DataContractSerialization

Imports System.Runtime.Serialization 
Imports Windows.Storage 

Public Class MagicItem 
    Property MagicItemName As String 
    Property MagicItemCost As Integer 
    Property MagicItemDescripyion As String 
    Property LimitToHero As Boolean 
    Property LimitToSpecialRule As String 'key to the special rule 

End Class 



Public Class clsMagicItems 
    Private MagicItems As New Dictionary(Of String, MagicItem) 

Async Sub SaveMagicItems() 
    ' StorageFile File = Await openPicker.PickSingleFileAsync(); 
    Dim myfile As StorageFile 
    myfile = Await ApplicationData.Current.LocalFolder.CreateFileAsync("MagicItems.dat", CreationCollisionOption.ReplaceExisting) 

    Dim KnownTypeList As New List(Of Type) 
    KnownTypeList.Add(GetType(clsMagicItems)) 
    KnownTypeList.Add(GetType(MagicItem)) 

    Dim r As Streams.IRandomAccessStream 
    r = Await myfile.OpenAsync(FileAccessMode.ReadWrite) 
    Using outStream As Streams.IOutputStream = r.GetOutputStreamAt(0) 
     Dim serializer As New DataContractSerializer(GetType(clsMagicItems), KnownTypeList) 
     serializer.WriteObject(outStream.AsStreamForWrite(), MagicItems) 
     Await outStream.FlushAsync() 
     outStream.Dispose() 
     r.Dispose() 
    End Using 
End Sub 
Async Sub LoadMagicItems() 
    Try 
     Dim myfile As Stream 

     Dim KnownTypeList As New List(Of Type) 
     KnownTypeList.Add(GetType(clsMagicItems)) 
     KnownTypeList.Add(GetType(MagicItem)) 

     Dim serializer As New DataContractSerializer(GetType(clsMagicItems), KnownTypeList) 
     myfile = Await ApplicationData.Current.LocalFolder.OpenStreamForReadAsync("MagicItems.dat") 
     'LINE BELOW RAISE ERROR 
     MagicItems = serializer.ReadObject(myfile) 
    Catch 
     'failed to load the file 
    End Try 
End Sub 
End Class 

回答

0

固定它,應該有下面的代碼

KnownTypeList.Add(GetType(Dictionary(Of String, MagicItem))) 
... 
Dim serializer As New DataContractSerializer(GetType(Dictionary(Of String, MagicItem)), KnownTypeList)