読者です 読者をやめる 読者になる 読者になる

いろいろ備忘録日記

主に .NET 絡みのメモを公開しています。

.NET クラスライブラリ探訪-032 (シリアライズ-5)(SoapFormatter, XmlSerializer, XmlTypeMapping)

C#


SOAP形式で、シリアライズする場合、よくSoapFormatterを利用するのですが
同じようにXmlSerializerを利用してもSOAP形式でシリアライズすることが出来ます。


この場合、そのままXmlSerializerを利用するのではなくて、以下のオブジェクトを
指定してXMLシリアライズします。

                XmlTypeMapping typeMapping = new SoapReflectionImporter().ImportTypeMapping(typeof(XXXXX));
                XmlSerializer  serializer  = new XmlSerializer(typeMapping);


どちらでも、ちゃんとしたSOAP形式のXMLが作成されるのですが
一点だけ注意点があります。


それは

SoapFormatterとXmlSerializerでシリアライズした結果が違う.


XmlSerializerでシリアライズした場合は、SOAPエンコード済みでシリアライズされます。
実際にサンプルを作成して見てみたほうがわかりやすいです

using System;
using System.Windows.Forms;
using System.Runtime.Serialization.Formatters.Soap;
using System.IO;
using System.Xml.Serialization;
using System.Runtime.Remoting.Metadata;

namespace SoapSerializeSample
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void btnOutput_Click(object sender, EventArgs e)
        {
            ClearTextFields();

            var data = new SampleData { Id = 1, Name = "テスト文字列" };

            //
            // SoapFormatterを用いたシリアライズ.
            // (SOAP形式でシリアル化)
            //
            using (MemoryStream writer = new MemoryStream())
            {
                SoapFormatter formatter = new SoapFormatter();
                formatter.Serialize(writer, data);

                writer.Position = 0;
                using (StreamReader reader = new StreamReader(writer))
                {
                    txtSoapFormatter.Text = reader.ReadToEnd();
                }                
            }
            
            //
            // XmlSerializer + XmlTypeMappingを用いたシリアライズ.
            // (SOAPエンコード済みXMLシリアル化)
            //
            using (MemoryStream writer = new MemoryStream())
            {
                XmlTypeMapping typeMapping = new SoapReflectionImporter().ImportTypeMapping(typeof(SampleData));
                XmlSerializer  serializer  = new XmlSerializer(typeMapping);

                serializer.Serialize(writer, data);

                writer.Position = 0;
                using (StreamReader reader = new StreamReader(writer))
                {
                    txtXmlSerializer.Text = reader.ReadToEnd();
                }
            }
        }

        private void ClearTextFields()
        {
            txtSoapFormatter.Text = string.Empty;
            txtXmlSerializer.Text = string.Empty;
        }
    }

    [Serializable]
    public class SampleData
    {
        [Soap]
        public int Id
        {
            get;
            set;
        }

        [Soap]
        public string Name
        {
            get;
            set;
        }

        public override string ToString()
        {
            return string.Format("{0}={1}", Id, Name);
        }
    }
}

上記のサンプルを実行してXMLをはかせてみると以下のようになります。


[SoapFormatter]

<SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:clr="http://schemas.microsoft.com/soap/encoding/clr/1.0" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<SOAP-ENV:Body>
<a1:SampleData id="ref-1" xmlns:a1="http://schemas.microsoft.com/clr/nsassem/SoapSerializeSample/SoapSerializeSample%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3Dnull">
<_x003C_Id_x003E_k__BackingField>1</_x003C_Id_x003E_k__BackingField>
<_x003C_Name_x003E_k__BackingField id="ref-3">テスト文字列</_x003C_Name_x003E_k__BackingField>
</a1:SampleData>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>


[XmlSerializer + XmlTypeMapping]

<?xml version="1.0"?>
<SampleData xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" id="id1">
  <Id xsi:type="xsd:int">1</Id>
  <Name xsi:type="xsd:string">テスト文字列</Name>
</SampleData>


サンプルは以下の場所にアップしてあります。
サンプルダウンロード



================================
過去の記事については、以下のページからご参照下さい。

サンプルコードは、以下の場所で公開しています。