2009-10-14 5 views
3

Je rencontre ce problème très étrange en essayant de sérialiser une classe pour la journalisation à l'aide de XmlSerializer. Le code a été généré par l'outil wsdl.exe. La classe qui obtient sérialisé comme il est déclaré comme suit:Xmlserializer ne sérialisant pas les membres de classe de base

[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")] 
[System.SerializableAttribute()] 
[System.Diagnostics.DebuggerStepThroughAttribute()] 
[System.ComponentModel.DesignerCategoryAttribute("code")] 
[System.Xml.Serialization.XmlTypeAttribute(Namespace = "xxxxx")] 
public partial class InheritedRequestA : BaseRequest 
{ 
} 

La sérialisation d'autres classes qui héritent aussi de BaseRequest comprend tous les membres non héritées, mais aucun des membres du public de BaseRequest. BaseRequest est déclaré comme suit.

[System.Xml.Serialization.XmlIncludeAttribute(typeof(InheritedRequestA))] 
[System.Xml.Serialization.XmlIncludeAttribute(typeof(InheritedRequestB))] 
[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")] 
[System.SerializableAttribute()] 
[System.Diagnostics.DebuggerStepThroughAttribute()] 
[System.ComponentModel.DesignerCategoryAttribute("code")] 
[System.Xml.Serialization.XmlTypeAttribute(Namespace = "xxxxx")] 
public partial class BaseRequest 
{ 
//members here 
} 

Pour sérialiser les demandes et les réponses ensemble, j'ai écrit une classe wrapper très basique qui contient uniquement un objet de requête et un objet de réponse. Le code pour la sérialisation:

 XmlSerializer serializer = new XmlSerializer(typeof(Wrapper)); 
     string serializedObject = string.Empty; 
     using (MemoryStream stream = new MemoryStream()) 
     { 
      serializer.Serialize(stream, wrapper); 
      stream.Position = 0; 
      using (StreamReader reader = new StreamReader(stream)) 
      { 
       serializedObject = reader.ReadToEnd(); 
      } 
     } 

Toute pensée pourquoi les propriétés publiques héritées de la classe de base ne sont pas sérialisés se serait grandement apprécié.

EDIT: Voici la classe wrapper. Je l'ai sous-classé dans ActivatorWrapper et VersionRetrieverWrapper.

[Serializable] 
[XmlInclude(typeof(Wrapper))] 
[XmlInclude(typeof(ActivatorWrapper))] 
[XmlInclude(typeof(VersionRetrieverWrapper))] 
public class Wrapper 
{ 
} 

[Serializable] 
public class VersionRetrieverWrapper : Wrapper 
{ 
    public InheritedRequestA Request { get; set; } 
    public InheritedResponseA Response { get; set; } 
} 
+0

Pourriez-vous publier la définition de 'Wrapper'? Mon soupçon est qu'il manque certains attributs de sérialisation. –

Répondre

5

Vous devez vous assurer que les membres du public de BaseRequest ont des valeurs qui leur sont assignées (que ce soit dans un constructeur par défaut, dans leurs déclarations, ou dans le code de votre service). Si ce n'est pas le cas, XmlSerializer va les ignorer à moins qu'ils ne soient nullables (int? bool?) et l'attribut XML IsNullable a la valeur true ([XmlElement(IsNullable = true)]).

0

Cela fonctionne très bien à condition que Demande/Réponse ne soit pas nulle. Voici un exemple d'application de travail:

class Program 
{ 
    static void Main(string[] args) 
    { 
     var wrapper = new VersionRetrieverWrapper(); 
     wrapper.Request = new InheritedRequestA(); 
     wrapper.Request.Member = "Request"; 
     wrapper.Response = new InheritedResponseA(); 
     wrapper.Response.Member = "Response"; 

     Console.WriteLine(Save(wrapper)); 
    } 

    public static string Save(Wrapper wrapper) 
    { 
     XmlSerializer serializer = new XmlSerializer(typeof(Wrapper)); 

     string serializedObject = string.Empty; 
     using (MemoryStream stream = new MemoryStream()) 
     { 
      serializer.Serialize(stream, wrapper); 
      stream.Position = 0; 
      using (StreamReader reader = new StreamReader(stream)) 
      { 
       serializedObject = reader.ReadToEnd(); 
      } 
     } 
     return serializedObject; 
    } 
} 
public partial class InheritedRequestA : BaseRequest 
{ 
} 

public partial class InheritedResponseA : BaseRequest 
{ 
} 
public partial class BaseRequest 
{ 
    //members here 
    public string Member; 
} 

[XmlInclude(typeof(VersionRetrieverWrapper))] 
public class Wrapper 
{ 
} 

public class VersionRetrieverWrapper : Wrapper 
{ 
    public InheritedRequestA Request { get; set; } 
    public InheritedResponseA Response { get; set; } 
} 
Questions connexes