3

J'essaie de sérialiser la classe B en tant qu'instance de classe de base A. Le DataContractSerializer ne me permettra pas de faire cela.Sérialisation DataContract d'un type hérité dans un type de base

Un exemple à défaut de sérialisation est la suivante:

class Program 
{ 
    [DataContract] 
    public class A 
    { 
     public int Id { get; set; } 
    } 

    [DataContract] 
    public class B : A 
    { 

    } 


    static void Main(string[] args) 
    { 
     A instance = new B { Id = 42 }; 

     var dataContractSerializer = new DataContractSerializer(typeof(A)); 
     var xmlOutput = new StringBuilder(); 
     using (var writer = XmlWriter.Create(xmlOutput)) 
     { 
      dataContractSerializer.WriteObject(writer, instance); 
     } 

    } 
} 

Je sais que la question est facilement résolu par l'attribut ajouté KnownTypes. Cependant, je veux garder la classe B cachée du projet (pas ajouter une référence).

Est-il possible de réaliser ce que je veux? J'ai essayé le XmlSerializer mais il m'a donné le même problème (il a ajouté le nom de type d'instance complet dans le XML) et est beaucoup plus clunkier à utiliser.

+0

Est-ce qu'il doit être XML? Ou doit-il fonctionner juste? –

+0

Ça peut juste marcher. Les tracas minimum seraient bien cependant. – R4cOON

Répondre

3
[DataContract(Name="YouCannotSeeMyName")] 
[KnownTypes(typeof(B))] 
public class B : A 

Et vous obtiendrez

<A itype="YouCannotSeeMyName"> 
    ... 
</A> 
+0

Je pense que cela va encore sérialiser tous les membres de B, ce qui n'était pas l'intention du PO. –

+0

@Mark Avenius: Pas si OP n'a pas mis l'attribut '[DataMember]' sur les propriétés de B. –

+0

excellent point :-) –

1

Je suis assez sûr que vous ne pouvez pas cacher parties du contrat. Cela équivaut à traiter avec un service Web où le contrat doit être honoré pour chaque fin pour comprendre comment et quoi sérialiser/désérialiser.

En outre, vous pouvez passer le type B dans le DataContractSerializer par rapport à l'utilisation de l'attribut.

class Program 
    { 
     [DataContract] 
     public class A 
     { 
      public int Id { get; set; } 
     } 

     [DataContract] 
     public class B : A 
     { 

     } 

     static void Main(string[] args) 
     { 
      A instance = new B { Id = 42 }; 

      var dataContractSerializer = new DataContractSerializer(typeof(A), new List<Type>() { typeof(B) }); 
      var xmlOutput = new StringBuilder(); 
      using (var writer = XmlWriter.Create(xmlOutput)) 
      { 
       dataContractSerializer.WriteObject(writer, instance); 
      } 

     } 
    } 

qui vous donnera ...

<Program.A xmlns:i="http://www.w3.org/2001/XMLSchema-instance" i:type="Program.B" 
xmlns="http://schemas.datacontract.org/2004/07/ConsoleApplication1" /> 
Questions connexes