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>
サンプルは以下の場所にアップしてあります。
サンプルダウンロード
================================
過去の記事については、以下のページからご参照下さい。
- いろいろ備忘録日記まとめ
サンプルコードは、以下の場所で公開しています。
- いろいろ備忘録日記サンプルソース置き場