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,故事就会有所不同 ;)