2

我有以下课程:

 public class RecipeItem
{
    public Guid ID { get; set; }
    public string Title { get; set; }
    public string Instructions { get; set; }
    public string Ingredients { get; set; }
    public string ImagePath {get; set;}

    [XmlIgnore]
    public BitmapImage ListPreview { get; set; }

}

我这样序列化:

private void SaveRecipe()
    {
        fileName = recipeID + ".txt";
        recipe.Title = TitleBox.Text;
        recipe.Ingredients = Ingredients.Text;
        recipe.Instructions = Instructions.Text;

        string tempJPEG = "image" + recipeID + ".jpg";

        IsolatedStorageFile store = IsolatedStorageFile.GetUserStoreForApplication();
        using (store = IsolatedStorageFile.GetUserStoreForApplication())
        {
            if (store.FileExists(tempJPEG))
            {
                recipe.ImagePath = tempJPEG;
            }


            using (var file = store.CreateFile(recipe.ID + ".txt"))
            {
                XmlSerializer serializer = new XmlSerializer(typeof(RecipeItem));
                serializer.Serialize(file, recipe);
            }
        }

        store.Dispose();
    }

最后反序列化为 ListBox 控件的 List,如下所示:

       public static List<RecipeItem> CreateTestList()
    {
        List<RecipeItem> list = new List<RecipeItem>();
        RecipeItem recipe = new RecipeItem();

        //Get files from isolated store.
        IsolatedStorageFile store = IsolatedStorageFile.GetUserStoreForApplication();
        try
        {
            XmlSerializer serializer = new XmlSerializer(typeof(RecipeItem));
            var filesName = store.GetFileNames();
            if (filesName.Length > 0)
            {
                foreach (string fileName in filesName)
                {
                    if (fileName == "__ApplicationSettings") continue;
                    using (var file = store.OpenFile(fileName, FileMode.Open))
                    {
                        try
                        {
                            recipe = (RecipeItem)serializer.Deserialize(file);
                        }
                        catch
                        {

                        }
                    }

                    using (store = IsolatedStorageFile.GetUserStoreForApplication())
                    {
                        if (recipe.ImagePath!=null)
                        {
                            using (var stream = store.OpenFile(recipe.ImagePath, FileMode.Open, FileAccess.ReadWrite))
                            {
                                recipe.ListPreview.SetSource(stream);
                                recipe.ListPreview.DecodePixelHeight = 100;
                                recipe.ListPreview.DecodePixelWidth = 100;                                
                            }

                        }
                    }
                }
            }
        }
        catch
        {

        }

        list.Add(recipe);
        store.Dispose();
        return list;
    }

我在代码行中不断收到 System.AccessViolationException:

 recipe.ListPreview.SetSource(stream);

基本上我在这里尝试做的是允许用户定义的图像绑定到列表框。因为不能序列化 BitmapImage,所以我将文件保存到 IsolatedStorage 中,并将路径保存到名为 ImagePath 的字符串中。当我反序列化为我的 ListBox 创建一个 List 时,我获取图像路径并打开图像文件并将其设置为 BitmapImage 的源,然后绑定到 ListBox。我的代码中的所有内容都可以正常工作,除了一行代码、序列化和反序列化都可以完美地工作,并且直接从独立存储将图像文件绑定到图像控件也可以完美地工作。

您认为可能导致 AccessViolationException 的原因是什么?

提前致谢!

4

2 回答 2

0

不舒尔,但我认为您不能直接在 UI 中使用 IsoStorageStream。尝试写入 MemoryStream并将该 memoryStream 用于 imageSource。

//something like this    
using (var store = IsolatedStorageFile.GetUserStoreForApplication())
{
     using (var storeStream = store.OpenFile("file.bin", System.IO.FileMode.Open))
     {
          var memoStream = new System.IO.MemoryStream();
          storeStream.CopyTo(memoStream);
          return memoStream;
     }
}

否则,我不明白你为什么这样做:

IsolatedStorageFile store = IsolatedStorageFile.GetUserStoreForApplication();
try
{
  using (store = IsolatedStorageFile.GetUserStoreForApplication())
  {...}
}

也许是错误的另一个原因

于 2013-08-28T08:46:35.507 回答
0

虽然这不是一个完全解决方案,但我找到了一种让它工作的方法。我定义了一个新的 BitmapImage,将它的源设置为来自 IsolatedStorage 的图像,然后我将该 BitmapImage 设置为等于 recipe.ListPreview。

BitmapImage Test = new BitmapImage();
Test.SetSource(stream);
recipe.ListPreview = Test;    

谢谢你的帮助!

于 2013-08-28T11:28:56.310 回答