// Serialise images inline with the document by default. store.Conventions.CustomizeJsonSerializer = serializer => serializer.Converters.Add(new AtlanticImageConverter());
/// <summary> /// Serialises <see cref="Image" /> properties as a <see cref="byte" /> array. /// </summary> public class AtlanticImageConverter : JsonConverter { #region Methods public override bool CanConvert(Type objectType) { return typeof (Image).IsAssignableFrom(objectType); } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { if (reader.TokenType == JsonToken.Null) { if (IsNullableType(objectType)) { return null; } throw new Exception(string.Format("Cannot convert null value to {0}.", objectType)); } byte[] numArray; switch (reader.TokenType) { case JsonToken.Bytes: numArray = reader.Value as byte[]; break; case JsonToken.String: numArray = Convert.FromBase64String(reader.Value.ToString()); break; default: throw new Exception(string.Format("Unexpected token parsing binary. Expected Bytes, got {0}.", reader.TokenType)); } return ToImage(numArray); } public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { if (value == null) { writer.WriteNull(); } var image = value as Image; var bytes = ToBlob(image); writer.WriteValue(bytes); } private bool IsNullableType(Type t) { return (t.IsGenericType) && t.GetGenericTypeDefinition() == typeof (Nullable<>); } private byte[] ToBlob(Image image) { if (image != null) { using (var stream = new MemoryStream()) { image.Save(stream, ImageFormat.Png); stream.Seek(0, SeekOrigin.Begin); var reader = new BinaryReader(stream); var buffer = new byte[stream.Length]; reader.Read(buffer, 0, buffer.Length); return buffer; } } return null; } private Bitmap ToImage(byte[] blob) { if (blob == null || blob.Length == 0) return null; using (var stream = new MemoryStream(blob)) { return new Bitmap(Image.FromStream(stream)); } } #endregion }
It is not a good idea :-) attachments are there for a reason ;-)
.m