2009-12-02 4 views
1

J'ai un code comme ceci:problème avec classe dérivée de sérialisation en C#

[Serializable] 
public class A { 
    public int X { get; set; } 
} 
[Serializable] 
public class B : A{   
} 
[Serializable] 
public class C { 
    public A A { get; set; } 
} 
... 
    public string Serialize<T>(T obj) 
    { 
     StringBuilder stringBuilder = new StringBuilder(); 
     TextWriter stringWriter = new StringWriter(stringBuilder); 
     XmlWriter xmlWriter = new XmlTextWriter(stringWriter); 
     XmlSerializer serializer = new XmlSerializer(typeof(T)); 
     serializer.Serialize(xmlWriter, obj); 
     xmlWriter.Close(); 
     stringWriter.Close(); 
     return stringBuilder.ToString(); 
    } 

    private void Run() { 
     C c = new C() {A = new B()}; 
     string str = Serialize(c); 
    }  

Je System.InvalidOperationException en Execute string str = SerializationManager.Serialize(c); avec le texte "There was an error generating the XML document."

Comment je dois écrire mon code pour sérialiser c sans exception?

Répondre

7

Vous devez le dire au sujet de l'héritage:

[XmlInclude(typeof(B)] 
public class A { 
    public int X { get; set; } 
} 
public class B : A{   
} 

Notez que vous ne pas besoin[Serializable] pour XmlSerializer.

également - regardez les exceptions intérieures:

try { ... } 
catch (Exception ex) { 
    while(ex != null) { 
     Console.WriteLine(ex.Message); 
     ex = ex.InnerException; 
    } 
} 

A voir:

« Le type B n'a pas été prévu Utilisez le XmlInclude ou un attribut SoapInclude pour spécifier les types qui ne sont pas connus statiquement. "

Questions connexes