Sto lavorando sull'applicazione in C #, dove ho bisogno di serializzare e deserializzare alcune classi in / da XML. Queste operazioni saranno implementate nella libreria di classi. Ho scelto la classe XMLSerialization per serializzare / deserializzare queste classi in un file XML. Come sapete, questa implementazione usa la reflection, che ha la condizione che la classe serializzata / deserializzata abbia bisogno di avere un costruttore senza parametri. Tuttavia, la classe serializzata ha un parametro obbligatorio, che è un buon candidato come parametro per il costruttore, per essere sicuro che sia inizializzato correttamente. Ho creato una classe manager per la serializzazione con due metodi, uno per archiviare in file e uno per caricare da file. Ho pensato a più soluzioni:
- Per la classe serializzata creare due costruttori, uno senza parametri e l'altro con parametro obbligatorio. Questa classe può essere serializzata facilmente, ma può essere inizializzata male, il che può causare problemi (magari in altri luoghi, ad esempio se la classe viene utilizzata in qualsiasi servizio Web).
- Poiché questa implementazione è nella libreria di classi, è possibile creare una classe A (per serializzare), che sarà pubblica e avrà un costruttore con parametro obbligatorio. I metodi manager assumeranno come parametro questa classe A o restituiranno la classe A dopo il caricamento. Ma internamente creerei la classe B, che sarà 1: 1 come classe A, ma con il costruttore senza parametri per scopi di serializzazione o deserializzazione. Questa classe B sarà interna, il che significa che è visibile solo nell'assembly corrente, quindi non può accadere, che può essere inizializzata male quando la libreria di classi è collegata. Tuttavia, questo causa codice duplicato. Immagina, che ci possano essere più classi come questa e più complesse. Ciò significa un'altra spesa.
- L'ultima soluzione, che mi viene in mente è quella di implementare la serializzazione da solo utilizzando Linq in XML. Questa soluzione è sicura e senza codice duplicato, ma l'implementazione è difficile per le grandi classi. O, peggio ancora, quando vogliamo cambiare i nomi degli elementi o passare da elementi a attributi, dobbiamo passare questa implementazione ogni volta con attenzione e cambiarla (invece di cambiare gli attributi).
Mentre sto cercando di trovare una soluzione migliore (forse ce n'è un'altra, che non conosco) e ho buone maniere nelle applicazioni di programmazione. Cosa ne pensi, qual è la soluzione migliore (forse in uno scenario e in un altro scenario un'altra soluzione)? Per maintan codice duplicato o codice complesso (forse per esperienza reale)?