Supongamos que tengo que serializar un objeto de una clase Auto en niveles, p. Interno y público. Algunas de las propiedades en el nivel público no se deben serializar ya que son internas.Decidir qué propiedades se serializan en el tiempo de ejecución
En este momento el camino 'fácil' que se me ocurre para lograr esto es mediante el uso de la herencia:
class CarPublic {
public int PropX {get;set}
}
class CarInternal: CarPublic {
public string PropY {get;set}
}
Entonces podría
object ToSerialize() {
CarInternal car = GetCar();
if(level == Level.Public) {
return car as CarPublic;
} else {
return car;
}
}
El resultado de la ToSerialize() se toma por un marco (no tengo control ) y serializado a JSON o XML.
He omitido los atributos de serialización XML para simplificar.
Esto se siente como un truco y los piratas lo llevan tan lejos. ¿Hay una mejor manera (maneras) de lograr esto?
Creo que ya está claro, pero me gustaría evitar escribir mis propios métodos de serialización para JSON y XML.
Gracias de antemano Tymek
EDITAR ==
Para aclarar, yo quiero ser capaz de serializar múltiples niveles:
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}
}
y
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;
}
== Enfoque elegido
Marqué la respuesta de Marc Gravell como la respuesta, ya que proporciona la información genérica de cómo C# y sus componentes "estándar" admiten lo que solicité.
Sin embargo, creo que el mejor enfoque para mi problema es utilizar clases proxy como se muestra arriba y tienen la clase siendo serializada en este patrón de niveles múltiples con métodos como los que se muestran a continuación.
public interface ICar {
Car0 As0();
Car1 As1();
Car2 As2();
Car3 As3();
...
}
Esto permite mantener los Car0..3 clases muy simple, con sólo propiedades, para mantener y entender.
Escribir métodos de serialización personalizados es la mejor manera que conozco (y realmente no es tan difícil). Usted tiene requisitos de serialización personalizados que se prestan a un serializador personalizado ... ¿Hay alguna razón particular por la que no desea ir por esa ruta? – Bill
La razón principal es que estoy en un entorno de framework donde la serialización debe ser hecha por el framework y solo devuelvo los resultados como objetos. – mayu
¿Puedes ver lo que otras clases dentro de este entorno están haciendo para resolver este problema, entonces? Si vas a hackearlo en pedazos, también puedes hackearlo de la misma forma que otras personas :) – Bill