Как отправить класс XmlSerializer в WebService и затем десериализовать его? - PullRequest
2 голосов
/ 29 мая 2010

Я хочу иметь возможность отправлять класс XmlSerializer (что очевидно генерируется в удаленном приложении C #) через WebService, который затем десериализует его в класс. (Я не знал, что это возможно)

Мой класс:

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 ]

3 голосов
/ 29 мая 2010

Сначала я предполагаю, что вы хотите передать произвольные типы одному веб-методу, где типы совместно используются клиентом и сервером.

Нет особого смысла отправлять 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());
1 голос
/ 29 мая 2010

Крис, спасибо за помощь. Это был важный шаг вперед.

Я решил проблему с отправкой строки 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));
    }

Теперь работает как шарм :)

Мой вопрос: могу ли я улучшить код?

Спасибо

...