我正在尝试使用IXmlSerializable接口的实现来序列化MailMessage对象。然后使用Image DataType将序列化对象存储在数据库(即使用SQL Server CE 3.5)中。除了附件集合之外,反序列化的一切正常。在deserilzing图像附加但没有在电子邮件中正确显示,文本文件是空的。
这是反序列化的代码(仅限附件列表部分)
// 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();
}
我从CodePlex上的GOPI C#邮件发送库中获取了此代码 http://gopi.codeplex.com/
即使在问题跟踪器中,这也是一个问题。请告知可能出现的问题。
编辑1 :很抱歉,我发布了我的试用代码。现在显示了正确的代码。(在writer.WriteBase64的序列化代码中(data,0,data.Length);
答案 0 :(得分:2)
您在序列化上转换为Base64,但在反序列化
上不这样做byte[] data = Convert.FromBase64String (node.InnerText);