2010-03-31 5 views
7

le code suivant spécifie un type « MyBase64Binary » qui est dérivé d'une classe de base « TestBase »erreur constructeur XmlSerializer avec classe dérivée d'une classe de base

using System; 
using System.Xml.Serialization; 
using System.Collections; 
using System.Xml.Schema; 
using System.ComponentModel; 

namespace Test 
{ 
    public class TestBase 
    { 
     public TestBase() 
     { 
     } 
    } 

    [XmlType(TypeName = "base64Binary"), Serializable] 
    public partial class MyBase64Binary : TestBase 
    { 
     [System.Xml.Serialization.XmlTextAttribute(DataType = "base64Binary")] 
     [EditorBrowsable(EditorBrowsableState.Advanced)] 
     public Byte[] __Value; 

     [XmlIgnore] 
     public Byte[] Value 
     { 
      get { return __Value; } 
      set { __Value = value; } 
     } 

     public MyBase64Binary() 
     { 
     } 

    } 
} 

Si je tente de créer un XmlSerializer comme celui-ci

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Xml.Serialization; 

namespace Test1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      XmlSerializer s = new XmlSerializer(typeof(Test.MyBase64Binary)); 
     } 
    } 
} 

de celui-ci alors que je reçois une erreur InvalidOperationException:

{"There was an error reflecting type 'Test.MyBase64Binary'."} 

Et l'exception interne me dit ce qui suit:

{"Cannot serialize object of type 'Test.MyBase64Binary'. Consider changing type of XmlText member 'Test.MyBase64Binary.__Value' from System.Byte[] to string or string array."} 

Si je tire pas de la classe « TestBase » puis tout fonctionne très bien.

Je ne comprends pas la solution. S'il vous plaît aider.
Qu'est-ce qui ne va pas?

Salutations de l'Allemagne
Jan

Répondre

4

Si vous modifiez le XmlTextAttribute à XmlAttribute ou XmlElement, cela devrait fonctionner. Puisque vous essayiez d'utiliser XmlTextAttribute, il supposait que ce serait une sorte de chaîne. Si vous voulez un tableau d'octets réel sérialisé, essayez le XmlAttribute ou XmlElement

+1

+1, le problème est l'attribut, il n'a rien à voir avec la classe de base. –

+2

Réservoirs! Ça semble fonctionner! Mais pourquoi le sérialiseur fonctionne-t-il si ommitting la classe de base et ne dérivent pas? L'exception ne devrait-elle pas également se produire? –

+0

@Jan Vivre le même problème. Si la classe de base est omise, cela fonctionne. Quelque chose d'étrange comportement ... – Sven

-1

Est-ce que l'ajout [Serializable] à votre classe de base aide? Je veillerais à ce que votre classe de base soit également bien décorée. Je ne sais pas si cela aidera ou non, cependant.

+1

Non, en ajoutant [Serializable] ne fonctionne pas. –

+3

'XmlSerializer' ** N'utilise PAS ** SerializableAttribute'. – Venemo

Questions connexes