2009-12-15 29 views
16

Tôi muốn XML-Serialize loại phức tạp (lớp), có thuộc tính thuộc loại System.Drawing.Bitmap trong số các loại khác.Nối tiếp một bitmap trong C# /. NET thành XML

/// <summary> 
    /// Gets or sets the large icon, a 32x32 pixel image representing this face. 
    /// </summary> 
    /// <value>The large icon.</value> 
    public Bitmap LargeIcon { get; set; } 

bây giờ tôi đã phát hiện ra rằng serializing Bitmap với serializer XML mặc định không hoạt động, bởi vì nó không có một constructor parameterless công cộng, mà là bắt buộc với serializer xml mặc định.

Tôi biết những điều sau đây:

Tôi không muốn tham chiếu một dự án khác cũng như tinh chỉnh rộng rãi lớp của tôi để chỉ cho phép xml tuần tự hóa các bitmap đó.

Không có cách nào để giữ đơn giản như vậy?

Rất cám ơn, Marcel

Trả lời

41

tôi sẽ làm một cái gì đó như:

[XmlIgnore] 
public Bitmap LargeIcon { get; set; } 

[Browsable(false),EditorBrowsable(EditorBrowsableState.Never)] 
[XmlElement("LargeIcon")] 
public byte[] LargeIconSerialized 
{ 
    get { // serialize 
     if (LargeIcon == null) return null; 
     using (MemoryStream ms = new MemoryStream()) { 
      LargeIcon.Save(ms, ImageFormat.Bmp); 
      return ms.ToArray(); 
     } 
    } 
    set { // deserialize 
     if (value == null) { 
      LargeIcon = null; 
     } else { 
      using (MemoryStream ms = new MemoryStream(value)) { 
       LargeIcon = new Bitmap(ms); 
      } 
     } 
    } 
} 
+0

Điều này tương tự như giải pháp được cung cấp bởi liên kết trong bài đăng gốc. Tuy nhiên với tôi, điều này vẫn có vẻ là giải pháp đơn giản nhất. – Marcel

+4

Thành thật mà nói, nó là lựa chọn hợp lý duy nhất với 'XmlSerializer'. Thực hiện 'IXmlSerializable' là yêu cầu đau. –

+0

+1 cho giải pháp này. Mã nguồn hoạt động tốt cho tôi. Cảm ơn nhiều. – Marcel

2

Lớp bitmap đã không được thiết kế để dễ dàng XML In nhiều. Vì vậy, không, không có cách nào đơn giản để sửa một quyết định thiết kế.

+1

Có vẻ bạn là đúng, một đó là nguyên nhân gây ra những rắc rối của tôi. – Marcel

+0

+1 để chỉ ra điều này – Marcel

5

Bạn cũng có thể triển khai ISerializable và sử dụng SerializationInfo để xử lý thủ công với nội dung bitmap của mình.

EDIT: João là đúng: Cách thực hiện để đối phó với XML serialization là thực hiện IXmlSerializable, không ISerializable:

public class MyImage : IXmlSerializable 
{ 
    public string Name { get; set; } 
    public Bitmap Image { get; set; } 

    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("Name"); 
     writer.WriteString(this.Name); 
     writer.WriteEndElement(); 

     using(MemoryStream ms = new MemoryStream()) 
     { 
      this.Image.Save(ms, ImageFormat.Bmp); 
      byte[] bitmapData = ms.ToArray(); 
      writer.WriteStartElement("Image"); 
      writer.WriteBase64(bitmapData, 0, bitmapData.Length); 
      writer.WriteEndElement(); 
     } 
    } 
} 
2

Thực hiện IXmlSerializable và sau đó tự mình xử lý tất cả các chi tiết tuần tự hóa.

Vì bạn nói rằng đó là một loại lớn và bạn chỉ có một vấn đề với các bitmap xem xét việc làm một cái gì đó như thế này:

public class BitmapContainer : IXmlSerializable 
{ 
    public BitmapContainer() { } 

    public Bitmap Data { get; set; } 

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

    public string Name { get; set; } 
} 
+0

Không thực sự lắm. Điều này sẽ liên quan đến một lớp dẫn xuất và khá nhiều mã. – Marcel

Các vấn đề liên quan