2010-02-14 13 views
5

Sto cercando di aggiungere la serializzazione XML a una struttura di classe abbastanza banale in C#. In sostanza, c'è una singola istanza di una classe root (lo chiamano AClass), che contiene un elenco di diverse istanze di qualche altra classe (lo chiamano AnotherClass):Serialize List <> delle classi dichiarate con il modificatore interno?

[XmlRoot("RootNode")] 
public class AClass { 
    [XmlElement("ListNode")] 
    internal List otherObjects { get; set; } 
} 

public class AnotherClass { 
    [XmlAttribute("Name")] 
    internal string name { get; set; } 
}

durante la serializzazione, mi piacerebbe per entrambi questi classi da serializzare insieme - cioè, se serializzo AClass, anche la sua lista di AnotherClass viene serializzata (vedi this question).

ho questo per lo più di lavoro, ma il problema è che durante la serializzazione, XmlSerializer sembra solo voler trattare con public proprietà della classe - non serializzare AnotherClass affatto se la lista è dichiarato internal.

Ho provato a fare internals del montaggio visibile al serializzatore:

[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("System.Xml")]

che non sembra fare nulla. C'è un modo per far sì che XmlSerializer serializzi ricorsivamente gli elenchi di oggetti dichiarati interni?

+0

+1 per la domanda perché l'assunto è che le proprietà devono essere pubbliche * perché è quello che ci è stato detto *. A volte penso che molti di noi si fermino al punto in cui ci viene detto che non possiamo fare qualcosa senza chiedere alternative. – IAbstract

risposta

6

Sei sulla strada giusta ... tranne che la serializzazione effettiva non viene eseguita da System.Xml, ma da un assembly generato dinamicamente. Non è possibile prevedere il nome di tale assembly (è generato casualmente), quindi non è possibile utilizzarlo nell'attributo InternalsVisibleTo.

L'unica soluzione è pre-generare l'assembly di serializzazione XML. Puoi farlo usando lo XML Serializer Generator Tool (Sgen.exe). Il nome dell'assembly generato sarà "YourAssembly.XmlSerializers"; questo è il nome che devi usare nell'attributo InternalsVisibleTo.

+0

Non conoscevo quello strumento! +1 da me. –

+0

+1 @Thomas: questo è bello sapere. Hai provato questo te stesso? – IAbstract

+0

E, btw ... una grande spiegazione sul perché l'attributo 'InternalsVisibleTo' non funzionerà in questo caso !!! – IAbstract

1

L'idea di aggiungere l'attributo InternalsVisibleTo è buona, ma il problema è che il codice di serializzazione Xml cerca solo i tipi pubblici nell'assembly.
Per quanto ne so, non c'è modo di rendere serializzato o deserializzare XmlSerializer tipi interni, e si dovrà dichiarare i tipi come pubblici o scrivere il proprio codice di serializzazione.
Inoltre, lo XmlSerializer class documentation dichiara esplicitamente che verranno serializzate solo le proprietà pubbliche dell'oggetto: "La serializzazione XML è il processo di conversione di proprietà e campi pubblici di un oggetto in un formato seriale (in questo caso XML) per l'archiviazione o il trasporto", quindi sembra davvero che sia una decisione di progettazione.

+0

In realtà la serializzazione dei membri interni funziona correttamente ... (vedere la mia risposta) –

+0

È possibile serializzare i tipi interni con XmlSerializer, ma in tal caso sarà necessario scrivere il proprio serializzatore di tipo personalizzato implementando IXmlSerializable su quel tipo specifico (e il tipo stesso deve essere pubblico). – Steven

Problemi correlati