Класс C #, на который ссылается веб-сервис, неправильно десериализован - PullRequest
4 голосов
/ 17 сентября 2009

У меня есть веб-сервис, который сериализует класс (класс из веб-сервиса) в MSMQ , затем служба Windows проверяет очередь и десериализацию. Служба windows имеет веб-ссылку для получения класса.

Если я выполню десериализацию внутри веб-службы, все получится нормально. Однако, когда я десериализовываю из службы Windows, все работает, за исключением двух строковых массивов, которые имеют нулевое значение, поэтому я считаю, что что-то не передается должным образом через веб-ссылку.

Вот фрагмент из рассматриваемого класса:

[Serializable, XmlInclude(typeof(EmailType))]
public partial class Email
{
[System.Xml.Serialization.XmlElement("BodyParameters")]
public string[] BodyParameters
{
    get
    {
        return this.bodyParameters;
    }
    set
    {
        this.bodyParameters = value;
    }
}

[System.Xml.Serialization.XmlElement("SubjectParameters")]
public string[] SubjectParameters
{
    get
    {
        return this.subjectParameters;
    }
    set
    {
        this.subjectParameters = value;
    }
}
}

Файл Reference.cs, который я получаю в своей службе Windows, выглядит следующим образом:

/// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("BodyParameters")]
    public string[] BodyParameters {
        get {
            return this.bodyParametersField;
        }
        set {
            this.bodyParametersField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("SubjectParameters")]
    public string[] SubjectParameters {
        get {
            return this.subjectParametersField;
        }
        set {
            this.subjectParametersField = value;
        }
    }

Есть ли какой-то особый способ, которым я должен ссылаться на класс или устанавливать строку [] в классе для правильной ссылки на него?

Вот вывод, который я получаю, если сериализовать в файл:

<?xml version="1.0" encoding="utf-8"?>
<Email xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"     xmlns:xsd="http://www.w3.org/2001/XMLSchema" MessageType="None" PackageID="0"     To="asdf@asdf.com" Subject="testing..." Body="this is a test" IsHTML="false">
  <BodyParameters>one two</BodyParameters>
  <BodyParameters>three four</BodyParameters>
  <BodyParameters>test test</BodyParameters>
  <SubjectParameters>foo</SubjectParameters>
</Email>

Имейте в виду, что все, кроме BodyParameters и SubjectParameters, прекрасно работает в службе Windows. Веб сервис, все работает.

Ответы [ 2 ]

1 голос
/ 18 сентября 2009

Вам нужно поместить [XmlArray] в свойство SubjectParameters, как это


    [System.Xml.Serialization.XmlArrayAttribute(ElementName="SubjectParameters")]
    public string[] SubjectParameters {
        get {
            return this.subjectParametersField;
        }
        set {
            this.subjectParametersField = value;
        }
    }
1 голос
/ 17 сентября 2009

Я столкнулся с этим несколько лет назад при разработке многоуровневого приложения. Я надеюсь, что ваша ситуация такая же, как и у меня, так что это будет полезно.

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

Классы были определены в проекте веб-службы. Пример:

<Serializable()> _
Public Class RetailInformation_StoreInformation
... 
End Class

Когда у нас был класс клиента, пытающийся десериализовать сериализованные данные, мы не могли этого сделать. Мы попытались скопировать dll, которая содержала класс RetailInformation_StoreInformation, в клиентские приложения, но он просто не десериализовался.

То, что мы в конечном итоге обнаружили, было это ..

Скажем, у нас есть клиентское приложение с именем StoreInfoDisplayApp

В проекте StoreInfoDisplayApp мы добавили веб-ссылку на веб-службу RetailInfoService.

Мы обнаружили, что НЕ можем десериализовать RetailInformation_StoreInformation из dll следующим образом:

Private Function DeSerializeStoreInfo(ByVal path As String) As RetailInformation_StoreInformation
        Dim ser As New System.Xml.Serialization.XmlSerializer(GetType(RetailInformation_StoreInformation))
        Dim reader As System.IO.Stream = File.OpenRead(path)
        Dim returnvalue As RetailInformation_StoreInformation = CType(ser.Deserialize(reader), RetailInformation_StoreInformation)
        reader.Close()
        Return returnvalue
    End Function

потому что компилятор (или память времени выполнения нечеткая) рассматривал это как StoreInfoDisplayApp.RetailInformation_StoreInformation

Вместо этого нам пришлось изменить все экземпляры

RetailInformation_StoreInformation

до

RetailInfoService.RetailInformation_StoreInformation

чтобы указать, что тип, который мы десериализовали, был того же типа, который обслуживал веб-сервис. Тогда это сработало как персик!

...