2017-02-08 1 views
0

J'ai une classe en C# que j'essaie de sérialiser en utilisant un DataContractSerializer. Il ressemble à ceci:Ignorer les types imbriqués avec DataContractSerializer

namespace Foo 
{ 
    [DataContract(Name = "Bar")] 
    class Bar 
    { 
     class A 
     { 
      public A(object a, object b, object c) 
      { 
       d = a; 
       e = b; 
       f = c; 
      } 
      public object d; 
      public object e; 
      public object f; 
     } 

     [DataMember] 
     private ArrayList lst = new ArrayList(); 
     ... 
    } 
} 

Lorsque je tente de sérialiser cette classe, je reçois une erreur:

« System.Runtime.Serialization.SerializationException: Type 'Foo.Bar + A' avec un contrat de données le nom '...' n'est pas prévu. Pensez à utiliser DataContractResolver si vous utilisez DataContractSerializer ou ajoutez des types non connus de façon statique à la liste des types connus. "

Ce que je veux faire est ignorer A. C'est juste la définition d'un type. Aucun des DataMembers que j'essaie de sérialiser n'est de type A.

Éditer: Ceci est le code de sérialisation.

public void Serialize() 
{ 
    var writer = new FileStream("testoutput.xml", FileMode.Create); 
    var serializer = new DataContractSerializer(typeof(Bar)); 
    serializer.WriteObject(writer, this); 
    writer.Close(); 
} 

L'exception est levée sur serializer.WriteObject.

+0

pouvez-vous poster le code où vous utilisez sérialiser un objet de type 'Bar'? – peval27

+0

@ peval27 édité – ifangy

+0

@ifangy votre code fonctionne bien pour moi. Version .NET? – peval27

Répondre

0

Après farfouillé un peu plus, j'ai pu le réparer comme ceci:

[KnownType(typeof(A))] 
[DataContractAttribute] 
class A 
{ 
    public A(object a, object b, object c) 
    { 
     d = a; 
     e = b; 
     f = c; 
    } 
    [DataMember] 
    public object d; 
    [DataMember] 
    public object e; 
    [DataMember] 
    public object f; 
} 

Je pense que l'un des ArrayLists tenait réellement As. Cette classe est massive, donc je l'ai probablement raté.