在WinRT中序列化BitmapImage

时间:2013-02-21 08:19:48

标签: c# serialization windows-8 windows-runtime winrt-xaml

public static async Task SaveFileAsync(string FileName, T data)
{
    MemoryStream memStream = new MemoryStream();
    DataContractSerializer serializer = new DataContractSerializer(typeof(T));
    serializer.WriteObject(memStream, data);

    StorageFile file = await ApplicationData.Current.LocalFolder.CreateFileAsync(FileName,
        CreationCollisionOption.ReplaceExisting);
    using (Stream stream = await file.OpenStreamForWriteAsync())
    {
        memStream.Seek(0, SeekOrigin.Begin);
        await memStream.CopyToAsync(stream);
        await stream.FlushAsync();
    }
}

public static async Task<T> RestoreFileAsync(string FileName)
{
    T result = default(T);
    try
    {
        StorageFile file = await ApplicationData.Current.LocalFolder.GetFileAsync(FileName);
        using (IInputStream inStream = await file.OpenSequentialReadAsync())
        {
            DataContractSerializer serializer = new DataContractSerializer(typeof(T));
            result = (T)serializer.ReadObject(inStream.AsStreamForRead());
            return result;
        }
    }

    catch (FileNotFoundException)
    {
        return default(T);
    }
}

我正在使用这些方法来序列化我的数据, 但我有一个包含图像的类

[DataMember]
Public Image img{get;set;}

我正在尝试序列化它。 我实际上正在做以下事情

var thumb = await item.GetThumbnailAsync(Windows.Storage.FileProperties.ThumbnailMode.PicturesView,
                        1000, Windows.Storage.FileProperties.ThumbnailOptions.UseCurrentScale);

BitmapImage bmg = new BitmapImage();
bmg.SetSource(thumb);
Image img = new Image();
img.Source = bmg;

我试图自己序列化bitmapImage,但这是同样的问题。 我一直收到这个错误,我的BitmapImage有一个属性。

  

类型'Windows.UI.Xaml.Media.ImageSource'无法序列化。请考虑使用DataContractAttribute属性对其进行标记,并使用DataMemberAttribute属性标记要序列化的所有成员。如果类型是集合,请考虑使用CollectionDataContractAttribute对其进行标记。有关其他受支持的类型,请参阅Microsoft .NET Framework文档。

1 个答案:

答案 0 :(得分:0)

DataContractSerializer无法使用图片。您应该使用BitmapEncoder(如果您正在处理WriteableBitmap或只是序列化BitmapImage的源地址。如果位图是从本地路径或临时URL加载的,您想要保留整个位图 - 无论如何都无法从BitmapImage中提取位图位,因此您需要从原始源URL下载源文件或复制您加载的本地文件。然后您可以将该副本保存为松散文件或序列化为DataContractSerializer创建的XML内的Base64。