2017-06-05 21 views
2

私は1つがイメージタイプのパブリックプロパティを持つオブジェクトを持っています。私はjson.netを使用してこれをシリアル化しようとしています。これをbase64でエンコードし、結果の文字列をシリアライズする必要があると仮定します。このテストコードで呼ばれた場合、私は、「バイナリを書くときに予期しない値型」私は例外を取得...イメージプロパティを含むjson.netを使用してjsonにオブジェクトをシリアル化する方法

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); 
    } 
} 

下記成功せず、プロパティに対してBinaryConverterで

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(); 

を試してみました。どんな助けも非常に役に立ちます。なぜなら、今私はしばらくの間ウェブを検索して成功していないからです。

+2

画像へのリンクを返す方がよいでしょうか? – derloopkat

答えて

3

Json.NETはImage何であるかについての考えを持っていないので、あなた

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); 
    } 
} 

その後、それはあなたのクラスがうまくシリアライズとデシリアライズされます両方:(BinaryConverterはイメージのためではない)コンバータを使用して、例えば、ビットにそれを手助けする必要があります。

+0

ありがとうEvk - これは完全に動作します –

3

私はここで、C#でそれを行う方法の一例をBASE64に画像を変換するために、この場合にお勧めしますし、それをシリアル化します:Convert Image to Base64

関連する問題