我有一个包含许多公共属性的对象,其中一个属于image类型。我试图使用json.net序列化这个并假设我需要对此进行base64编码并序列化结果字符串。我已尝试使用BinaryConverter对抗该属性,但未在
下面成功public class Person
{
public string name { get; set; }
public int age { get; set; }
[JsonConverter(typeof(BinaryConverter))]
public Image photo { get; set; }
public string ToJson()
{
return JsonConvert.SerializeObject(this);
}
}
使用此测试代码调用时......
var p = new Person();
p.name = "John Doe";
p.age = 99;
p.photo = Image.FromFile(@"dea4007a-c812-41e9-b09a-c7793c6e853d.jpg");
var json = p.ToJson();
Console.WriteLine(json);
Console.ReadKey();
我在编写二进制文件时遇到异常“意外的值类型”。任何帮助都会非常有用,因为我已经在网上搜索了一段时间但没有成功。
答案 0 :(得分:7)
Json.NET不知道Image
是什么,所以你需要帮助它,例如使用转换器(BinaryConverter
不适用于图像):
public class ImageConverter : JsonConverter
{
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) {
var base64 = (string)reader.Value;
// convert base64 to byte array, put that into memory stream and feed to image
return Image.FromStream(new MemoryStream(Convert.FromBase64String(base64)));
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) {
var image = (Image) value;
// save to memory stream in original format
var ms = new MemoryStream();
image.Save(ms, image.RawFormat);
byte[] imageBytes = ms.ToArray();
// write byte array, will be converted to base64 by JSON.NET
writer.WriteValue(imageBytes);
}
public override bool CanConvert(Type objectType) {
return objectType == typeof(Image);
}
}
public class Person
{
public string name { get; set; }
public int age { get; set; }
[JsonConverter(typeof(ImageConverter))]
public Image photo { get; set; }
public string ToJson()
{
return JsonConvert.SerializeObject(this);
}
}
然后它会很好地序列化和反序列化你的类。
答案 1 :(得分:4)
我建议在这种情况下将图像转换为base64,然后将其序列化,这里有一个如何在C#中执行此操作的示例:Convert Image to Base64