私は次のクラスを持っています:
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);
基本的にここでやろうとしているのは、ユーザー定義の Image を ListBox にバインドできるようにすることです。BitmapImage はシリアル化できないため、代わりにファイルを IsolatedStorage に保存し、パスを ImagePath という文字列に保存します。ListBox の List を作成するために逆シリアル化するときは、イメージ パスを取得してイメージ ファイルを開き、それを BitmapImage のソースに設定して、ListBox にバインドします。1 行のコード、シリアル化と逆シリアル化の両方が問題なく機能し、IsolatedStorage から直接 Image ファイルを Image コントロールにバインドすることを除いて、私のコードのすべてが正常に機能します。
AccessViolationException の原因は何だと思いますか?
前もって感謝します!