Генерация XML в веб-сервисах ASP.NET 2.0? - PullRequest
0 голосов
/ 31 марта 2011

Я создаю веб-сервис (.asmx) с ASP 2.0, и многие мои методы возвращают пользовательские объекты.Он всегда конвертировал мои объекты в XML для меня, используя свойства объектов, но я столкнулся с ситуацией, когда этого не происходит.

Мне нужно вернуть несколько объектов разных классов одновременно,и классы, к сожалению, не связаны через наследование, поэтому я возвращаю массив объектов из моего веб-метода.Вывод выглядит следующим образом:

<ArrayOfAnyType>
<anyType xsi:type="Type1"/>
<anyType xsi:type="Type2"/>
</ArrayOfAnyType>

Классы Type1 и Type2 имеют определенные свойства, но они не реализуются автоматически и доступны только для чтения.Все свойства, которые я видел автоматически преобразованные в XML, были полностью автоматически реализованы.Вот почему он не конвертируется должным образом?Я собираюсь изменить дизайн моих классов, чтобы заставить это работать, или есть атрибут, который я могу добавить где-нибудь, или интерфейс, который я могу реализовать, или что-то подобное?

Мои объявления классов выглядят так:

Public Class Type1
    Dim _var1 As Decimal

    Public Sub New()
        Dim conn As New SqlConnection(ConfigurationManager.AppSettings("myString"))
        conn.Open()
        Dim command As New SqlCommand("SELECT * FROM table1", conn)
        Dim reader As SqlDataReader = command.ExecuteReader()
        reader.Read()
        _var1 = reader("Var1")
        reader.Close()
        conn.Close()
    End Sub

    Public ReadOnly Property Var1() As Decimal
        Get
            Return _var1
        End Get
    End Property
End Class

РЕДАКТИРОВАТЬ: уточнить мой вопрос: почему процесс сериализации XML игнорирует мои свойства в этом классе?Потому что они не реализованы автоматически?Или потому что они только для чтения?Или что-то еще?

Ответы [ 2 ]

2 голосов
/ 01 апреля 2011

Сериализация XML работает только с открытыми свойствами чтения / записи. Извините, но ваши свойства только для чтения никогда не будут сериализованы.

0 голосов
/ 31 марта 2011

Веб-службы ASP.NET 2.0 запускают сериализатор XML в System.Xml.Serialization (если память служит) и связанные с ним атрибуты, такие как XmlIgnore ().

К сожалению, заставить его работать с полиморфной коллекцией может быть немного хитростью. Если это ограниченное количество классов, самый простой выход - сделать что-то вроде:

public class Shelf
{
    public Bottle[] Bottles {get; set;}
    public Box[] Boxes {get; set;}
}

Возможно, стоит посмотреть WCF здесь, у него гораздо лучшие варианты.

...