Domanda

Esistono progetti chiusi o open source per un serializzatore XML per C # che possono serializzare per la maggior parte qualsiasi oggetto senza la necessità di inquinare i miei oggetti di dominio con tonnellate di attributi? Che gestirà anche la serializzazione di raccolte create con le classi generiche interne? Un vantaggio sarebbe che può gestire la serializzazione di una proprietà del tipo di interfaccia. Un altro vantaggio sarebbe che può serializzare oggetti che hanno proprietà di sola lettura (o almeno con l'accessor get contrassegnato come interno)

È stato utile?

Soluzione

Bene, per prima cosa definisci " avanzato " ;, cioè quale specificamente ti serve che XmlSerializer non ha. In termini di POCO, XmlSerializer ha un ctor sovraccarico che accetta tutti gli attributi che mai potresti voler aggiungere, per evitare di doverli aggiungere al tuo modello a oggetti - ma lo fa richiede ancora un costruttore pubblico senza parametri e funziona solo su campi / proprietà pubblici di lettura / scrittura. E dovresti memorizzare nella cache / riutilizzare il serializzatore se usi questo approccio.

Non sono a conoscenza di alternative simili, semplicemente perché nella maggior parte dei casi questo è "abbastanza buono" - ed è spesso un errore provare a forzare brutalmente il tuo oggetto di dominio esistente in un DTO. Potrebbe essere più semplice e più gestibile mappare semplicemente le entità del tuo dominio su un nuovo DTO a cui è attribuito (e che ha un ctor / proprietà / ecc.).

Nota che per il problema ctor / properties DataContractSerializer ha alcune risposte, ma questo non ha un controllo così preciso su come appare l'xml.

Altri suggerimenti

  • Puoi consentire a System.Xml.dll di accedere ai tuoi interni usando InternalsVisibleToAttribute. Quindi serializzare tipi interni e / o membri interni. Compresi .ctors interni.
  • Puoi anche implementare IXmlSerializable sulle classi per personalizzare la loro serializzazione (come il contenitore contenente riferimenti di interfaccia).
  • Non è necessario fornire gli attributi di serializzazione XML sulle classi, ma invece fornirli come XmlAttributeOverrides.

XmlSerializer è quasi sempre esattamente ciò che le persone vogliono, semplicemente non sanno che è flessibile come in realtà.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top