【发布时间】:2021-03-31 06:19:39
【问题描述】:
我正在尝试序列化一个成员为ImageSource 类型的类。
班级是:
public class AppInfo
{
public string Name { get; set; }
public ImageSource Icon { get; set; }
public bool Is90Hz { get; set; }
}
我得到这样的类的数据:
private static IList<AppInfo> GetAppInfos()
{
var localAppInfo = new List<AppInfo>();
var allAppsRaw = DependencyService.Get<IGetAllApps>().GetApps();
var pm = Android.App.Application.Context.PackageManager;
if (pm == null)
return null;
foreach (var info in allAppsRaw)
{
var bitmap = DependencyService.Get<IGetAllApps>().DrawableToBitmap(info.LoadIcon(pm));
byte[] bitmapData;
using (var stream = new MemoryStream())
{
bitmap.Compress(Bitmap.CompressFormat.Png, 0, stream);
bitmapData = stream.ToArray();
}
var imageSource = ImageSource.FromStream(() => new MemoryStream(bitmapData, 0, bitmapData.Length));
localAppInfo.Add(new AppInfo { Name = info.LoadLabel(pm), Icon = imageSource, Is90Hz = true });
}
return localAppInfo;
}
问题在于 System.Text.Json 无法序列化该类型。我来回搜索如何将其转换为字节数组或 Base64 字符串,但我有点迷路了。
我将[JsonConverter(typeof(ImageSourceConverter))] 添加到成员并声明我的转换器类如下:
public class ImageSourceConverter : JsonConverter<ImageSource>
{
public override ImageSource Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
}
public override void Write(Utf8JsonWriter writer, ImageSource value, JsonSerializerOptions options)
{
}
}
但我现在有点迷失了......只是无法弄清楚读写方法的逻辑。
*编辑: 最终目标是展示它,目前的做法:
<ListView Grid.Column="3" x:Name="AppsView" CachingStrategy="RecycleElement" Margin="10,10,10,10">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<StackLayout Orientation="Horizontal" CompressedLayout.IsHeadless="true">
<Image Source="{Binding Icon, Mode=TwoWay}" WidthRequest="40" HeightRequest="40" HorizontalOptions="StartAndExpand"/>
<Label Text="{Binding Name, Mode=TwoWay}" VerticalOptions="CenterAndExpand" HorizontalOptions="CenterAndExpand"/>
<Switch IsToggled="{Binding Is90Hz, Mode=TwoWay}" HorizontalOptions="EndAndExpand"/>
</StackLayout>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</ContentPage.Content>
【问题讨论】:
-
我认为没有任何简单的方法可以做到这一点。 ImageSource 并非旨在公开其基础数据。您最好在 AppInfo 类中存储文件路径、url 或 byte[]。
标签: c# json xamarin serialization xamarin.forms