UWP 转换要使用 Json 序列化的 bitmapImage。
UWP Converting a bitmapImage to be serialized with Json.
我有一个 class (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 添加到我的 class 时,它无法被序列化。
我读过有关将 bitmapImage 转换为字符串或字节数组的信息,但我无法理解代码。
有谁知道如何将 bitmapImage 转换为可以序列化的格式?
奖金
将其转换为 json 的格式后。我如何将其转换回来??
更多奖金
如果我有一个链接到 XAML 中每个 MyClass 对象的所有图像的列表视图,我是否需要做任何特别的事情才能使 myClass 保存图像和序列化图像,以便我可以将图像保存在 json 中,但也可以使用图像从 MyClass 绑定到 XAML?
中的图像
在 UWP 中,BitmapImage 被用作 UI 作为图像源。它不是 read/write 对象。所以我的建议是 serialize/deserialize 图像数据本身(这里是一个字节数组)并发布一个 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,故事就会有所不同 ;)
我有一个 class (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 添加到我的 class 时,它无法被序列化。
我读过有关将 bitmapImage 转换为字符串或字节数组的信息,但我无法理解代码。
有谁知道如何将 bitmapImage 转换为可以序列化的格式?
奖金
将其转换为 json 的格式后。我如何将其转换回来??
更多奖金
如果我有一个链接到 XAML 中每个 MyClass 对象的所有图像的列表视图,我是否需要做任何特别的事情才能使 myClass 保存图像和序列化图像,以便我可以将图像保存在 json 中,但也可以使用图像从 MyClass 绑定到 XAML?
中的图像在 UWP 中,BitmapImage 被用作 UI 作为图像源。它不是 read/write 对象。所以我的建议是 serialize/deserialize 图像数据本身(这里是一个字节数组)并发布一个 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,故事就会有所不同 ;)