Внедрить Bitmap в base64 Serialzer [duplicate]

Существует инструкция сборки x86 ( bsf ), которая сделает это. :)

Больше оптимизировано?!

Боковое примечание:

Оптимизация на этом уровне по своей природе зависит от архитектуры. Сегодняшние процессоры слишком сложны (с точки зрения предсказания ветвлений, промахов кэш-памяти, конвейерной обработки), что так сложно предсказать, какой код выполняется быстрее, на какой архитектуре. Уменьшение операций с 32 до 9 или подобное может даже снизить производительность на некоторых архитектурах. Оптимизированный код в одной архитектуре может привести к ухудшению кода в другом. Я думаю, вы бы либо оптимизировали это для конкретного процессора, либо оставили его таким, каким он есть, и пусть компилятор выбирает то, что, по его мнению, лучше.

17
задан John Saunders 15 December 2009 в 13:29
поделиться

4 ответа

Я бы сделал что-то вроде:

  [XmlIgnore] public Bitmap LargeIcon {get;  задавать;  } [Browsable (false), EditorBrowsable (EditorBrowsableState.Never)] [XmlElement («LargeIcon»)] public byte [] LargeIconSerialized {get {// сериализовать if (LargeIcon == null) возвращает значение null;  используя (MemoryStream ms = new MemoryStream ()) {LargeIcon.Save (ms, ImageFormat.Bmp);  return ms.ToArray ();  }} set {// deserialize if (value == null) {LargeIcon = null;  } else {using (MemoryStream ms = новый MemoryStream (значение)) {LargeIcon = новый битмап (мс);  }}}}  
41
ответ дан Marc Gravell 16 August 2018 в 01:07
поделиться
  • 1
    Это похоже на решение, предоставленное ссылкой в ​​исходном сообщении. Однако для меня это все еще кажется самым простым решением. – Marcel 15 December 2009 в 13:43
  • 2
    Честно говоря, это единственный разумный вариант с XmlSerializer . Реализация IXmlSerializable требует боли. – Marc Gravell♦ 15 December 2009 в 13:47
  • 3
    +1 для этого решения. Исходный код хорошо работает для меня. Большое спасибо. – Marcel 15 December 2009 в 14:23
  • 4
    У меня есть небольшая проблема с использованием этого кода. Будет ли массив байтов автоматически заполняться при десериализации? И если да, мне нужно будет преобразовать этот массив в битмап после этого? В настоящее время я получаю "InvalidOperationException & quot; когда десериализация попадает в линию с BMP. Спасибо за помощь! – Dinoo 19 July 2010 в 21:29
  • 5
    @Dinoo - он должен работать только через свойства. Какую версию .NET вы используете? (из любопытства) – Marc Gravell♦ 19 July 2010 в 21:33

Внесите IXmlSerializable , а затем обработайте все детали сериализации самостоятельно.

Поскольку вы говорите, что это большой тип, и у вас есть только проблема с растровым изображением, подумайте о том, чтобы сделать что-то вроде этого:

  общедоступный класс BitmapContainer: IXmlSerializable {public BitmapContainer () {} общедоступный Bitmap Data {get;  задавать;  } public XmlSchema GetSchema () {throw new NotImplementedException ();  } public void ReadXml (XmlReader reader) {throw new NotImplementedException ();  } public void WriteXml (XmlWriter writer) {throw new NotImplementedException ();  }} public class TypeWithBitmap {public BitmapContainer MyImage {get;  задавать;  } public string Имя {get;  задавать;  }}  
2
ответ дан João Angelo 16 August 2018 в 01:07
поделиться
  • 1
    Не очень практично. Это будет включать производный класс и довольно много кода. – Marcel 15 December 2009 в 13:44

Класс BitMap не был разработан для простого XML-сериализации. Итак, нет, нет простого способа исправить дизайнерское решение.

2
ответ дан John Saunders 16 August 2018 в 01:07
поделиться

Вы также можете реализовать ISerializable и использовать SerializationInfo для ручного управления содержимым вашего растрового изображения.

EDIT: João прав: Правильный путь для обработки сериализации XML заключается в реализации IXmlSerializable , а не ISerializable :

  public class MyImage: IXmlSerializable {public string Name {get;  задавать;  } public Bitmap Image {get;  задавать;  } public System.Xml.Schema.XmlSchema GetSchema () {throw new NotImplementedException ();  } public void ReadXml (System.Xml.XmlReader reader) {throw new NotImplementedException ();  } public void WriteXml (System.Xml.XmlWriter writer) {writer.WriteStartElement («Имя»);  writer.WriteString (this.Name);  writer.WriteEndElement ();  используя (MemoryStream ms = новый MemoryStream ()) {this.Image.Save (ms, ImageFormat.Bmp);  byte [] bitmapData = ms.ToArray ();  writer.WriteStartElement ( "Изображение");  writer.WriteBase64 (bitmapData, 0, bitmapData.Length);  writer.WriteEndElement ();  }}}  
5
ответ дан Rubens Farias 16 August 2018 в 01:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: