我有一个类(MyClass),我使用
序列化public class MyClass
{
public string Name { get; set;}
public BitmapImage image { get; set;}
}
private ObservableCollection<MyClass> _myClass;
private const string fileName = "myclass.json";
public DataSource()
{
_myClass = new ObservableCollection<MyClass>();
}
public async Task<ObservableCollection<MyClass>> GetMyClass()
{
await ensureDataLoaded();
return _myClass;
}
private async Task ensureDataLoaded()
{
if(_myClass.Count == 0;)
await GetMyClassDataAsync();
}
private async Task GetMyClassDataAsync()
{
if(_myClass.Count != 0)
return;
var jsonSerializer = new DataContractJsonSerializer(typeof(ObservableCollection<MyClass>));
try
{
using(var stream = away ApplicationData.Current.LocalFolder.OpenStreamForReadAsync(fileName))
{
_myClass = (ObservableCollection<MyClass>) jsonSerializer.ReadObject(stream);
}
}
catch
{
_myClass = new ObservableCollection<MyClasss>();
}
}
public async void AddMyClass(MyClass myClass)
{
_myClass.Add(myClass);
await SaveMyClassDataAsync();
}
public async void DeleteMyClass(MyClass myClass)
{
_myClass.Remove(myClass);
await SaveMyClassDataAsync();
}
private async Task SaveMyClassDataAsync()
{
var jsonSerializer = new DataContractJsonSerializer(typeof(ObservableCollection<MyClass>));
using (var stream = await ApplicationData.Current.LocatlFolder.OpenStreamForWriteAsync(fileName,
CreationCollisionOption.ReplaceExisting))
{
jsonSerializer.WriteObject(stream, _myClass);
}
}
当我向我的班级添加一个bitmapImage时,它无法被序列化。
我已经阅读过有关将bitmapImage转换为字符串或字节数组的信息,但我无法弄清楚代码。
Doest有谁知道如何将bitmapImage转换为可以序列化的格式?
加成
将其转换为json格式后。我怎么把它转换回来?
MoreBonus
如果我有一个链接到XAML中每个MyClass对象的所有图像的列表视图,那么我需要做些什么特别的事情,以便myClass保存图像&amp;一个序列化的图像,以便我可以将图像保存在json中,但也可以使用图像从MyClass绑定到XAML中的图像?
答案 0 :(得分:0)
在UWP中,BitmapImage用于将UI作为图像源提供。它不是读/写对象。所以我的建议是自己序列化/反序列化图像数据(这里是一个字节数组),并使用这些数据发布一个ImageBitmap属性进行绑定。
[JsonObject(MemberSerialization.OptIn)]
public class MyClass
{
private BitmapImage _Image;
[JsonProperty]
public string Name { get; set; }
public BitmapImage Image
{
get
{
if (ImageBytes == null)
return null;
if (_Image == null)
_Image = new BitmapImage();
using (var stream = new InMemoryRandomAccessStream())
{
stream.WriteAsync(ImageBytes.AsBuffer()).Completed = (i, j) => {
stream.Seek(0);
_Image.SetSource(stream);
};
}
return _Image;
}
}
[JsonProperty]
public byte[] ImageBytes { get; set; }
}
如果您有图像的URI,那么故事会有所不同;)