Я думал, что Object был неизвестным типизированным объектом? Нет в XmlSerializationWriter

У меня есть веб-сервис, который всегда возвращает ReturnObject, который является классом, который я написал следующим образом:

public class ReturnObject
{
    public Status Status { get; set; }
    public Object Data { get; set; }
}

Когда я возвращаю один объект, такой как int или string и т. д. в Data, все в порядке, но когда я хочу вернуть список типизированных объектов, клиент, который запускает веб-службу как WebReference, получает это исключение:

System.Web.Services.Protocols.SoapException: серверу не удалось обработать запрос. ---> System.InvalidOperationException: Произошла ошибка при создании XML-документа ---> System.InvalidOperationException: Typen System.Collections.Generic.List`1[[Transticket.Domain.Models.ApsisMailingList, Transticket.Domain, Version= 1.0.0.0, культура = нейтральная, PublicKeyToken = null]] могут быть добавлены в контекст. vid System.Xml.Serialization.XmlSerializationWriter.WriteTypedPrimitive(имя строки, String ns, Object o, Boolean xsiType) vid Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriter1.Write1_Object(String n, String ns, Object o, Boolean isNullable, Boolean needType ) vid Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriter1.Write3_ReturnObject(String n, String ns, ReturnObject o, Boolean isNullable, Boolean needType)
vid Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriter1.Write6_GetListsResponse(Object[] p) vid Microsoft.Xml.Serialization.GeneratedAssembly.ArrayOfObjectSerializer5.Serialize(Object objectToSerialize, XmlSerializationWriter Writer) vid System.Xml.Serialization.XmlSerializer.Serialize(XmlWriter xmlWriter, Object o, XmlSerializerNamespaces namespaces, String encodingStyle, String id) --- Slut på сбор стека для внутренней среды ---
vid System.Xml.Serialization.XmlSerializer .Serialize(XmlWriter xmlWriter, Object o, пространства имен XmlSerializerNamespaces, String encodingStyle, String id) vid System.Web.Services.Protocols.SoapServerProtocol.WriteReturns(Object[] returnValues, Stream outputStream) vid System.Web.Services.Protocols.WebServiceHandler. WriteReturns(Object[] returnValues) vid System.Web.Services.Protocols.WebServiceHandler.Invoke() --- Шлюха в стеке для внутреннего доступа ---

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

Если я делаю там еще один ReturnObject и указываю список типизированных объектов в качестве данных, это работает хорошо.

У кого-нибудь есть идея, как я могу это обобщить? Я всегда думал, что List — это тип Object, но выглядит как ошибка .NET, или я что-то пропустил?


person RickardP    schedule 06.10.2011    source источник


Ответы (1)


XmlSerializer не включает в вывод информацию о типе (в отличие от BinaryFormatter); как таковой, нет надежного способа десериализации object, поскольку xml может быть (в буквальном смысле) чем угодно.

То же самое относится и к большинству сериализаторов на основе контрактов (DataContractSerializer, protobuf-net и т. д.).

В основном: не делайте этого. object это бесполезно использовать в веб-сервисе, и это не может работать.

person Marc Gravell    schedule 06.10.2011