2012-04-02 4 views
0

У меня есть 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 службы), который возвращает список файлов (List). Когда я вызываю службу, метод выполняется заранее, но процесс сериализации не выполняется. Это Исключение, которое я получаю:

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_GetFilesByNameResponse (Object [] p) \ n в Microsoft. Xml.Serialization.GeneratedAssembly.ArrayOfObjectSerializer1.Serialize (Object objectToSerialize, XmlSerializationWriter writer) \ n в System.Xml.Serialization.XmlSerializer.Serialize (XmlWriter xmlWriter, Object o, XmlSerializerNamespaces пространства имен, String encodingStyle, String id) \ n --- End внутренней трассировки стека исключений --- \ n в System.Xml.Serialization.XmlSerializer.Serialize (XmlWriter xmlWriter, Object o, XmlSerializerNamespaces namespaces, 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 --- Конец внутренней проверки стека исключений ---

Любой знает почему?

ответ

1

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

Смежные вопросы