Supponiamo di devo serializzare un oggetto di una classe auto a livelli esempio Interno e Pubblico. Alcune delle proprietà nel livello Pubblico non dovrebbero essere serializzate in quanto interne.Decidere quali proprietà vengono serializzati in fase di esecuzione
In questo momento il modo 'semplice' mi viene in mente per raggiungere questo obiettivo è quello di utilizzare l'ereditarietà:
class CarPublic {
public int PropX {get;set}
}
class CarInternal: CarPublic {
public string PropY {get;set}
}
Poi ho potuto
object ToSerialize() {
CarInternal car = GetCar();
if(level == Level.Public) {
return car as CarPublic;
} else {
return car;
}
}
Il risultato della ToSerialize() è preso da un framework (non ho il controllo ) e serializzato su JSON o XML.
ho omesso gli attributi di serializzazione XML per semplicità.
Questo si sente come un hack hack e si prende solo finora. C'è modo migliore (modi?) Per raggiungere questo obiettivo?
penso che la sua ormai chiaro, ma vorrei evitare di scrivere i miei metodi di serializzazione per JSON e XML.
Grazie in anticipo Tymek
EDIT ==
Per chiarire, io voglio essere in grado di serializzare più livelli:
class Car0 {
public int PropA {get;set}
}
class Car1: Car0 {
public string PropB {get;set}
}
class Car2: Car1 {
public int PropC {get;set}
}
class Car3: Car2 {
public string PropD {get;set}
}
e
object ToSerialize(Level level) {
Car3 car = GetCar();
switch(level) {
case Level.Zero: return car as Car0;
case Level.One: return car as Car1;
case Level.Two: return car as Car3;
case Level.Three: return car as Car4;
}
return null;
}
== Approccio scelto
ho segnato la risposta di Marc Gravell come la risposta, in quanto fornisce le informazioni generiche di come C# ed è componenti 'standard' sostenere quello che ho chiesto.
Tuttavia penso che l'approccio migliore per il mio problema è quello di utilizzare le classi proxy come indicato sopra e avere la classe di essere serializzato in questo schema multi-livello con metodi come indicato qui sotto.
public interface ICar {
Car0 As0();
Car1 As1();
Car2 As2();
Car3 As3();
...
}
questo permette di mantenere i Car0..3 classi molto semplice, con solo proprietà, per mantenere e comprendere.
Scrivere i metodi di serializzazione personalizzati è il modo migliore che conosco (e in realtà non è così difficile). Hai requisiti di serializzazione personalizzati che si prestano ad un serializzatore personalizzato ... C'è un motivo particolare per cui non vuoi seguire questo percorso? – Bill
Il motivo principale è che sono in un ambiente framework in cui la serializzazione deve essere eseguita dal framework e restituisco solo i risultati come oggetti. – mayu
Puoi vedere quali altre classi all'interno di questo ambiente stanno facendo per risolvere questo problema? Se hai intenzione di hackerarlo a pezzi, potrebbe anche modificarlo allo stesso modo degli altri :) – Bill