UWP使用Json将bitmapImage转换为序列化。

时间:2015-12-12 02:50:45

标签: json serialization uwp bitmapimage

我有一个类(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中的图像?

1 个答案:

答案 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,那么故事会有所不同;)