我正在开发一款音乐地铁风格的应用程序。我从用户的音乐库中获取所有音乐文件,我想存储
在此行的 SaveAsync() 函数上
StorageFile
对象,因为我不想一遍又一遍地检索。为此,我尝试序列化StorageFile
对象并将其存储到XML
中。从这里here和here的示例中,我尝试生成XML
文件,但在创建XML文件时抛出异常,其中包含以下信息:
类型“Windows.Storage.StorageFile”无法序列化。请考虑使用DataContractAttribute属性标记它,并使用DataMemberAttribute属性标记要序列化的所有成员。如果该类型是集合,请考虑使用CollectionDataContractAttribute进行标记。有关其他支持的类型,请参阅Microsoft .NET Framework文档。
到目前为止,我的代码如下:
namespace CloudMusic.AppSettings
{
[KnownType(typeof(CloudMusic.AppSettings.MusicFileDict))]
[DataContractAttribute]
public class MusicFileDict
{
[DataMember]
public object musicStorageFile { get; set; }
[DataMember]
public int id { get; set; }
}
}
而从下面的类中我正在生成XML
class GenerateMusicDict
{
private const string filename = "musiclist.xml";
static private List<MusicFileDict> _data = new List<MusicFileDict>();
static public List<MusicFileDict> Data
{
get { return _data; }
}
static async public Task Save<T>()
{
await Windows.System.Threading.ThreadPool.RunAsync((sender) => GenerateMusicDict.SaveAsync<T>().Wait(), Windows.System.Threading.WorkItemPriority.Normal);
}
internal static async Task SaveAsync<T>()
{
GenerateMusicDict.GenerateMusicFileDict();
try
{
StorageFile sessionFile = await ApplicationData.Current.LocalFolder.CreateFileAsync(filename, CreationCollisionOption.ReplaceExisting);
IRandomAccessStream sessionRandomAccess = await sessionFile.OpenAsync(FileAccessMode.ReadWrite);
IOutputStream sessionOutputStream = sessionRandomAccess.GetOutputStreamAt(0);
var sessionSerializer = new DataContractSerializer(typeof(List<MusicFileDict>), new Type[] { typeof(T) });
sessionSerializer.WriteObject(sessionOutputStream.AsStreamForWrite(), _data);
await sessionOutputStream.FlushAsync();
}
catch (Exception)
{
}
}
/// <summary>
/// Generate music file dictonary according to songs ID
/// </summary>
/// <param name="musicFileList"></param>
private static void GenerateMusicFileDict()
{
List<StorageFile> music_file_list = MusicFileDict.GetMusicList(); // At this stage i'll get all my music files,GetMusicList() function returns List<StorageFile>
for (int i = 0; i < music_file_list.Count; i++)
{
_data.Add(new MusicFileDict { id = i, musicStorageFile = music_file_list[i]});
}
}
}
并从我的主类中调用Save方法
await GenerateMusicDict.Save<MusicFileDict>();
在此行的 SaveAsync() 函数上
sessionSerializer.WriteObject(sessionOutputStream.AsStreamForWrite(), _data);
它触发了一个异常
,并显示:
类型“Windows.Storage.StorageFile”无法序列化。考虑使用DataContractAttribute属性标记它,并使用DataMemberAttribute属性标记您想要序列化的所有成员。如果该类型是集合,请考虑使用CollectionDataContractAttribute标记它。有关其他支持的类型,请参阅Microsoft .NET Framework文档。 那么我该如何序列化它?或者有没有什么方法可以将其存储和重用。请帮帮我。
object musicStorageFile
的类型是什么?显然最终的对象是导致错误的原因。如果它是音乐文件,则无法使用XML序列化它。 - Ucodia