Я пытаюсь сериализовать объект MailMessage, используя реализацию интерфейса IXmlSerializable. Затем сериализованный объект сохраняется в базе данных (то есть с использованием SQL Server CE 3.5) с использованием Image DataType. Все отлично работает на десериализации, кроме коллекции вложений. При удалении изображения Изображения прикреплены, но не отображаются правильно в электронном письме, текстовые файлы пусты.
Это код для десериализации (только часть списка вложений)
// Attachments
XmlNode attachmentsNode = GetConfigSection(xml, "SerializableMailMessage/MailMessage/Attachments");
if (attachmentsNode != null)
{
foreach (XmlNode node in attachmentsNode.ChildNodes)
{
string contentTypeString = string.Empty;
if (node.Attributes["ContentType"] != null)
contentTypeString = node.Attributes["ContentType"].Value;
ContentType contentType = new ContentType(contentTypeString);
MemoryStream stream = new MemoryStream();
byte[] data = Encoding.UTF8.GetBytes(node.InnerText);
stream.Write(data, 0, data.Length);
Attachment attachment = new Attachment(stream, contentType);
this.Email.Attachments.Add(attachment);
}
}
private XmlNode GetConfigSection(XmlDocument xml, string nodePath)
{
return xml.SelectSingleNode(nodePath);
}
и это код для сериализации
// Attachments
if (this.AttachmentList!=null)
{
writer.WriteStartElement("Attachments");
foreach (Attachment attachment in this.AttachmentList)
{
writer.WriteStartElement("Attachment");
if (!string.IsNullOrEmpty(attachment.Name))
writer.WriteAttributeString("ContentType", attachment.ContentType.ToString());
using (BinaryReader reader = new BinaryReader(attachment.ContentStream))
{
byte[] data = reader.ReadBytes((int)attachment.ContentStream.Length);
writer.WriteBase64(data, 0, data.Length);
}
writer.WriteEndElement();
}
writer.WriteEndElement();
}
Я получил этот код из библиотеки отправки почты GOPI C # на CodePlex
http://gopi.codeplex.com/
Даже в трекере проблем это проблема. Просьба сообщить, что может быть не так.
РЕДАКТИРОВАТЬ 1 : Извините, ребята, я опубликовал свой пробный код. Теперь отображается правильный код (в сериализованном коде на writer.WriteBase64 (data, 0, data.Length);