首先,我假设您想将任意类型传递给单个 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());