сериализация настраиваемых объектов

У меня есть 2 класса, которые являются производными от общего базового класса.

[Serializable()]
[XmlInclude(typeof(User))]
[XmlInclude(typeof(File))]
public class BaseEntity<T>
{
    private long id;

    [XmlAttribute(AttributeName = "id")]
    public virtual long ID
    {
        get { return this.id; }
        set { this.id = value; }
    }
}

[Serializable()]
public class User : BaseEntity<User>
{
    private string userName;
    private string sharedDirectory;
    private bool connected;

    [XmlAttribute(AttributeName = "UserName")]
    public virtual string UserName 
    {
        get { return this.userName; }
        set { this.userName = value; } 
    }

    [XmlAttribute(AttributeName = "SharedDirectory")]
    public virtual string SharedDirectory
    {
        get { return this.sharedDirectory; }
        set { this.sharedDirectory = value; }
    }

    [XmlAttribute(AttributeName = "IsConnected")]
    public virtual bool IsConnected
    {
        get { return this.connected; }
        set { this.connected = value; }
    }
}

[Serializable()]
public class File : BaseEntity<File>
{
    private string name;
    private User user;

    [XmlAttribute(AttributeName = "Name")]
    public virtual string Name
    {
        get { return this.name; }
        set { this.name = value; }
    }

    [XmlElement(ElementName = "User", Type = typeof(User))]
    public virtual User User
    {
        get { return this.user; }
        set { this.user = value; }
    }
}

У меня есть веб-служба (не служба WCF), которая возвращает список файлов (список). Когда я вызываю службу, метод выполняется, но процесс сериализации не выполняется. Это исключение, которое я получаю:

System.Web.Services.Protocols.SoapException: сервер не смог обработать запрос. ---> System.InvalidOperationException: произошла ошибка при создании XML-документа. ---> System.InvalidOperationException: тип Castle.Proxies.UserProxy не ожидался. Используйте атрибут XmlInclude или SoapInclude, чтобы указать типы, которые не известны статически. \ N в Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriter1.Write4_User (String n, String ns, User o, Boolean isNullable, Boolean needType) \ n в Microsoft. Xml.Serialization.GeneratedAssembly.XmlSerializationWriter1.Write6_File (String n, String ns, File o, Boolean isNullable, Boolean needType) \ n в Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriter1.Write7_GetFilesBy. Xml.Serialization.GeneratedAssembly.ArrayOfObjectSerializer1.Serialize (Object objectToSerialize, XmlSerializationWriter writer) \ n в System.Xml.Serialization.XmlSerializer.Serialize (XmlWriter xmlWriter, String, StringSerializerNameSerializer, ObjectServiceSerializer n внутренней трассировки стека исключений --- \ n в System.Xml.Serialization.XmlSerializer.Serialize (XmlWriter xmlWriter, Object o, пространства имен XmlSerializerNamespaces, String encodingStyle, String id) \ n в System.Web.Services.Protocols.SoapServerProtocol.WriteReturns (Object [] returnValues, Stream outputStream) \ n в System.Web.Services.Protocols.WebServiceHandler.WriteReturns (Object [] returnValues) \ n в System.Web.Services.Protocols.WebServiceHandler.Invoke () \ n --- Конец трассировки стека внутренних исключений ---

Кто-нибудь знает почему?


person Mr T.    schedule 02.04.2012    source источник


Ответы (1)


Это потому, что я использовал lazy = true, и когда я сериализовал свои объекты, сериализатор попытался сериализовать объект Proxy, что НЕ разрешено. когда я изменил отображение на lazy = false, это сработало!

person Mr T.    schedule 05.08.2012