【问题标题】:UWP Converting a bitmapImage to be serialized with Json.UWP 使用 Json 转换要序列化的位图图像。
【发布时间】:2016-01-28 20:56:43
【问题描述】:

我有一个使用

序列化的类 (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 转换为字符串或字节数组的信息,但我无法弄清楚代码。

有谁知道如何将 bitmapImage 转换为可以序列化的格式?

奖金

将其转换为 json 格式后。我将如何将其转换回来??

更多奖励

如果我有一个链接到 XAML 中每个 MyClass 对象的所有图像的列表视图,我需要做些什么特别的事情来让 myClass 保存一个图像和一个序列化图像,以便我可以将图像保存在 json 中还要使用图像从 MyClass 绑定到 XAML 中的图像?

【问题讨论】:

标签: json serialization uwp bitmapimage


【解决方案1】:

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

【讨论】:

  • async-await 在 setter 中?
  • 您可能正试图从另一个线程访问 UI 线程。尝试使用调度程序。 Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.High, () => { XAMLimage.Source = _myClass.Image; });
  • 当我说设置图像时,我很抱歉。我的意思是从 PickSingleFileAsync 流中将图像设置为 _myClass.Image,但在尝试将图像设置为 _myClass.Image 时出现错误,然后才到达 XAMLimage.source
  • 在我的示例中,您没有设置 Image 属性,而是设置了 ImageBytes 属性,即序列化/反序列化的属性。
  • PickSingleFileAsync 将为您获取一个 StorageFile,您必须从那里获取一个字节数组并将其设置为 ImageBytes 属性
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-17
  • 2013-09-20
  • 2017-08-30
相关资源
最近更新 更多