2

XmlSerializerクラス(リモートC#アプリケーションで明らかに生成される)をWebService経由で送信して、クラスに逆シリアル化できるようにしたいと考えています。(私もそれが可能だとは知りませんでした)

私のクラスは:

SystemInfo

私はそれをこのようにシリアル化しています:

        XmlSerializer mySerializer = new XmlSerializer(typeof(SystemInfo));
        StreamWriter myWriter = new StreamWriter(textBox1.Text);
        mySerializer.Serialize(myWriter, sysinfo);

Webサービスを構築するにはどうすればよいですか?

    [WebMethod]
    public void Reports(XmlSerializer xmlSerializer)
    {
      .
      .
      .
    }

誰かが私を助けることができますか?

よろしく

4

2 に答える 2

3

まず、任意の型を 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());
于 2010-05-29T13:59:16.183 に答える
1

Chris, thanks for helping me out. It was a major step forward.

I solved the problem sending the xml string:

        SystemInfo sysinfo = new SystemInfo();
        sysinfo.RUN();

        XmlSerializer mySerializer = new XmlSerializer(typeof(SystemInfo));

        MemoryStream memStream = new MemoryStream();
            mySerializer.Serialize(memStream, sysinfo);
            memStream.Seek(0, System.IO.SeekOrigin.Begin);
            XmlDocument doc = new XmlDocument();
            doc.Load(memStream);
        memStream.Close();

        localhost.WS_Agente dasdsa = new localhost.WS_Agente();
        dasdsa.Reports(doc.InnerXml);

And the WebService:

    [WebMethod]
    public void Reports(string xml)
    {
        XmlSerializer mySerializer = new XmlSerializer(typeof(SystemInfo));
        SystemInfo obj = (SystemInfo)mySerializer.Deserialize(new StringReader(xml));
    }

Its working like a charm now :)

My question is: Can i improve the code?

Thanks

于 2010-05-29T16:39:08.960 に答える