まず、任意の型を 1 つの Web メソッドに渡したいとします。この Web メソッドでは、型はクライアントとサーバーで共有されます。
XmlSerializer を送信する意味はあまりありません。シリアライズ/デシリアライズするロジックしかありません。ストリームに読み書きされる実際のデータはありません。すべきことは、文字列または XmlNode を渡すことです。
Web サービスの呼び出し元は、XmlSerializer のクライアント側インスタンスを呼び出して、オブジェクトを文字列にシリアル化し、その文字列を引数として渡して Web メソッドを呼び出すことができます。次に、Web メソッド自体が XmlSerializer のインスタンスを作成し、文字列を逆シリアル化してオブジェクトに戻すことができます。もちろん、シリアライザーのサーバー サイズ インスタンスを作成するには、シリアライザーを作成するためのルート タイプを知る必要があります。これをタイプ名として渡し、Type.GetType()を使用して、XmlSerializer に渡す正しいタイプを取得できます。 .
渡すタイプが事前にわかっている場合は、Web メソッドをより強く型付けして宣言し、受け取ると予想されるタイプのメソッドを明示的に作成することもできます。
ワイヤ形式があまり問題にならない場合は、SoapFormatter
またはを使用BinaryFormatter
してシリアライゼーション/デシリアライゼーションを処理することもできます。後者の BinaryFormatter の場合、Web メソッドがbyte[]
引数を取るように宣言します。これらのフォーマッター (シリアライザー) の利点は、フォーマッターのインスタンスを作成するときに型に関する追加情報を必要としないことです。 XmlSerializer より遅い
更新: いくつかの簡単な例を追加しました (未テスト)
XmlSerializer を使用した例です。ここではクライアント側から型名を渡す必要があるため、追加の引数にしました。
[WebMethod]
public void Reports(string xml, string typeName)
{
XmlSerializer xs = new XmlSerializer(Type.GetType(typeName));
object obj = xs.Deserialize(new StringReader(xml));
// use the deserialize object
}
BinaryFormatter を使用した例。型名は必要ありませんが、クラス型はシリアライズ可能である必要があります
[WebMethod]
public void Reports(byte[] data)
{
BinaryFormatter bf = new BinaryFormatter();
object obj = bf.Deserialize(new MemoryStream(data));
// use the deserialized object
}
クライアント側では、次のようなものを使用して、BinaryFormatter を使用してシリアル化します。
// initialize the SystemInfo instance that you want to pass to the server
SystemInfo si = new SystemInfo() { SystemName = "My System" };
// Serialize to a memory stream
BinaryFormatter bf = new BinaryFormatter();
MemoryStream ms = new MemoryStream();
bf.Serialize(ms, si);
// Call the service, passing the array from the memory stream
ws.Reports(ms.ToArray());