2

我希望能够通过 WebService 发送一个 XmlSerializer 类(在远程 C# 应用程序中很明显),然后将其反序列化为一个类。(我也不知道它可能)

我的课是:

SystemInfo

我这样序列化它:

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

如何构建 WebService?

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

谁能帮我吗?

问候

4

2 回答 2

3

首先,我假设您想将任意类型传递给单个 Web 方法,其中类型由客户端和服务器共享。

发送 XmlSerializer 没什么意义,它只有序列化/反序列化的逻辑。它没有实际数据,即读取/写入流。您应该做的是传递一个字符串或 XmlNode。

然后,Web 服务的调用者可以使用 XmlSerializer 的客户端实例并将对象序列化为字符串,然后调用将字符串作为参数传递的 Web 方法。然后,它自己的 Web 方法可以创建 XmlSerializer 的实例并将字符串反序列化回对象。当然,要创建序列化程序的服务器大小实例,您需要知道为其创建序列化程序的根类型,您可以将其作为类型名称传递并使用Type.GetType()获取正确的类型以传递给 XmlSerializer .

如果您预先知道要传递哪些类型,那么您还可以声明您的 Web 方法具有更强的类型,并为您希望接收的类型显式创建方法。

如果有线格式不是太大的问题,您还可以使用 userSoapFormatter或 aBinaryFormatter来处理序列化/反序列化。在 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

克里斯,谢谢你帮助我。这是向前迈出的重要一步。

我解决了发送 xml 字符串的问题:

        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);

和网络服务:

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

它现在就像一个魅力:)

我的问题是:我可以改进代码吗?

谢谢

于 2010-05-29T16:39:08.960 回答