我希望能够通过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)
{
.
.
.
}
任何人都可以帮助我吗?
此致
答案 0 :(得分:3)
首先,我假设您要将任意类型传递给单个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的示例,不需要类型名称,但类类型需要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));
}
它现在像魅力一样工作:)
我的问题是:我可以改进代码吗?
由于