如何将XmlSerializer类发送到WebService然后反序列化?

时间:2010-05-29 12:57:20

标签: c# web-services xmlserializer

我希望能够通过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)
    {
      .
      .
      .
    }

任何人都可以帮助我吗?

此致

2 个答案:

答案 0 :(得分:3)

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

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

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

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

如果线路格式不是太大问题,您也可以使用SoapFormatterBinaryFormatter来处理序列化/反序列化。在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的示例,不需要类型名称,但类类型需要serializable

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

答案 1 :(得分: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);

WebService:

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

它现在像魅力一样工作:)

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

由于