Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用包含图像属性的json.net将对象序列化为json_C#_Json_Image_Serialization_Json.net - Fatal编程技术网

C# 如何使用包含图像属性的json.net将对象序列化为json

C# 如何使用包含图像属性的json.net将对象序列化为json,c#,json,image,serialization,json.net,C#,Json,Image,Serialization,Json.net,我有一个具有许多公共属性的对象,其中一个是image类型的。我正在尝试使用json.net对其进行序列化,并假设我需要对其进行base64编码并序列化结果字符串。我在下面的属性中尝试了BinaryConverter,但没有成功 public class Person { public string name { get; set; } public int age { get; set; } [JsonConverter(typeof(BinaryConverter)

我有一个具有许多公共属性的对象,其中一个是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();

我得到一个异常“写入二进制文件时出现意外值类型”。任何帮助都会非常有用,因为我已经在网上搜索了一段时间,但没有成功。

在这种情况下,我建议将图像转换为base64,然后将其序列化,这里有一个如何在C#中实现的示例:

Json.NET不知道什么是
image
,因此您必须稍微帮助一下,例如,通过使用转换器(
BinaryConverter
不适用于图像):


然后,它将序列化和反序列化您的类。

返回到映像的链接不是更好吗?不。在各种情况下,json并不表示发送回网页或其他可用资源的请求,而是表示在系统之间传输的对象,例如用于同步的对象。
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);
    }
}