Сначала я предполагаю, что вы хотите передать произвольные типы одному веб-методу, где типы совместно используются клиентом и сервером.
Нет особого смысла отправлять XmlSerializer, он имеет только логику для сериализации / десериализации. Он не имеет фактических данных, которые либо считываются / записываются в поток. Что вы должны сделать, это передать либо строку, либо и XmlNode.
Затем вызывающий веб-сервис может на стороне клиента создать экземпляр XmlSerializer и сериализовать объект в строку, а затем вызвать веб-метод, передав строку в качестве аргумента. Затем сам веб-метод может создать экземпляр XmlSerializer и десериализовать строку обратно в объект. Конечно, чтобы создать экземпляр размера сервера сериализатора, вам нужно знать корневой тип для создания сериализатора, вы можете передать его как имя типа и использовать Type.GetType () , чтобы получить правильный введите для передачи в XmlSerializer.
Если вы заранее знаете, какие типы вы собираетесь передавать, вы также можете объявить свой веб-метод более строго типизированным и явно создать методы для типов, которые вы ожидаете получить.
Если формат передачи данных не слишком важен, вы также можете использовать SoapFormatter
или BinaryFormatter
для обработки сериализации / десериализации. В последнем случае BinaryFormatter вы бы объявили, что ваш веб-метод принимает аргумент 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());