A damn at han’s Windows phone book 筆記(23:序列化,圖片)

來源:互聯網
上載者:User

序列化

儲存在IsolatedStorageSettings.ApplicationSettings字典中的對象都要能被序列化。所有這些對象都被序列化存放在一個叫做__ApplicationSettings的XML檔案中。如果有對象無法成功地序列化進字典,它也不會報錯,而是不聲不響地失敗。

所有的基礎類型,基礎類型的集合,以及由基礎類型構成的類都可以成功序列化,因此可以認為,沒有什麼是不能序列化的,如果要有意讓某個欄位不進行序列化,則可以加上IgnoreDataMember屬性來排除該欄位。

注意:儘管你可以將指向同一個對象的多個引用序列化,但是還原序列化之後,就不是指向同一個對象了,而是多份拷貝。要妥善處理好這個問題。

 
從檔案/相機載入圖片
if (age.PhotoFilename != null){    this.BackgroundImage.Source = IsolatedStorageHelper.LoadFile(age.PhotoFilename);}
下面這個函數包含了圖片檔案的擷取、儲存、刪除、解碼等多個功能:
void PictureButton_Click(object sender, EventArgs e){  Microsoft.Phone.Tasks.PhotoChooserTask task = new PhotoChooserTask();  task.ShowCamera = true;  task.Completed += delegate(object s, PhotoResult args)  {    if (args.TaskResult == TaskResult.OK)    {      string filename = Guid.NewGuid().ToString();      IsolatedStorageHelper.SaveFile(filename, args.ChosenPhoto);      Age age = Settings.List.Value[Settings.CurrentAgeIndex.Value];      if (age.PhotoFilename != null)        IsolatedStorageHelper.DeleteFile(age.PhotoFilename);      age.PhotoFilename = filename;      // Seek back to the beginning of the stream      args.ChosenPhoto.Seek(0, SeekOrigin.Begin);      // Set the background image instantly from the stream      // Turn the stream into an ImageSource      this.BackgroundImage.Source = PictureDecoder.DecodeJpeg(        args.ChosenPhoto, (int)this.ActualWidth, (int)this.ActualHeight);    }  };  task.Show();}

帶緩衝的圖片檔案操作輔助類

public static class IsolatedStorageHelper{    static Dictionary<string, ImageSource> cache = new Dictionary<string, ImageSource>();    public static void SaveFile(string filename, Stream data)    {        using (IsolatedStorageFile userStore = IsolatedStorageFile.GetUserStoreForApplication())        using (IsolatedStorageFileStream stream = userStore.CreateFile(filename))        {            // Get the bytes from the input stream            byte[] bytes = new byte[data.Length];            data.Read(bytes, 0, bytes.Length);            // Write the bytes to the new stream            stream.Write(bytes, 0, bytes.Length);        }    }    public static ImageSource LoadFile(string filename)    {        if (cache.ContainsKey(filename))        {            return cache[filename];        }        using (IsolatedStorageFile userStore = IsolatedStorageFile.GetUserStoreForApplication())        using (IsolatedStorageFileStream stream = userStore.OpenFile(filename, FileMode.Open))        {            // Turn the stream into an ImageSource            ImageSource source = PictureDecoder.DecodeJpeg(stream);            cache[filename] = source;            return source;        }    }    public static void DeleteFile(string filename)    {        using (IsolatedStorageFile userStore =               IsolatedStorageFile.GetUserStoreForApplication())            userStore.DeleteFile(filename);    }}

PictureDecoder.DecodeJpeg方法執行速度慢,而且必須要UI線程調用,因此會影響使用者體驗,所以這裡用到了cache。

如果有特別多的圖片(不便使用cache)且經常要載入圖片,建議用WriteableBitmap.LoadJpeg方法,因為該方法可以由後台線程調用。

這個類修改一下就是通用的檔案操作輔助類。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.