3

IXmlSerializable インターフェイスの実装を使用して MailMessage オブジェクトをシリアル化しようとしています。シリアル化されたオブジェクトは、Image DataType を使用して (SQL Server CE 3.5 を使用している) データベースに格納されます。Attachment Collection を除いて、デシリアライゼーションではすべて正常に動作します。デシリアライズすると、画像は添付されますが、電子メールに正しく表示されません。テキスト ファイルは空です。

デシリアライズするコードです(添付リスト部分のみ)

 // 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 http://gopi.codeplex.com/の GOPI C# メール送信ライブラリから取得しました。

問題トラッカーでも、これは問題です。うまくいかない可能性があることを親切にアドバイスしてください。

編集 1 : 申し訳ありませんが、トライアウト コードを投稿しました。正しいコードが表示されます。(writer.WriteBase64(data, 0, data.Length) のシリアル化コード内)

4

1 に答える 1

2

シリアライズで Base64 に変換しますが、デシリアライズでは変換しません

byte[] data = Convert.FromBase64String (node.InnerText);
于 2011-02-26T10:57:02.333 に答える