3

Ich versuche, Klasse B als eine Instanz der ita Basisklasse A zu serialisieren. Die DataContractSerializer wird mir nicht erlauben, das zu tun.DataContract Serialisierung eines geerbten Typs in einen Basistyp

Ein Beispiel der Serialisierung Fehler ist wie folgt:

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); 
     } 

    } 
} 

Ich weiß, dass das Problem einfach durch das Attribut KnownTypes hinzugefügt aufgelöst wird. Allerdings möchte ich die Klasse B aus dem Projekt versteckt halten (keine Referenz hinzufügen).

Ist es überhaupt möglich zu erreichen, was ich will? Ich habe versucht, die XmlSerializer, aber es gab mir das gleiche Problem (es fügte den vollständigen Namen des Instanztyps in der XML) und ist viel klunker zu verwenden.

+0

Ist es XML sein muss? Oder muss es einfach funktionieren? –

+0

Es kann einfach funktionieren. Minimaler Aufwand wäre aber gut. – R4cOON

Antwort

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

Und Sie werden

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

Ich denke, das wird immer noch alle Mitglieder von B serialisieren, was nicht die Absicht des OP war. –

+0

@Mark Avenius: Nicht, wenn OP 'Attribut [DataMember]' nicht auf die Eigenschaften von B gesetzt hat. –

+0

ausgezeichneter Punkt :-) –

1

Ich bin mir ziemlich sicher, dass Sie nicht verstecken Teile des Vertrages erhalten. Dies ist vergleichbar mit dem Umgang mit einem Web-Service, bei dem der Vertrag für jedes Ende geehrt werden muss, um zu verstehen, wie und was serialisiert/deserialisiert werden soll.

Zusätzlich können Sie den B Typ innerhalb der DataContractSerializer gegen die Verwendung des Attributs übergeben.

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); 
      } 

     } 
    } 

, die Ihnen ...

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