Решение, какие свойства сериализуются во время выполнения
Предположим, мне нужно сериализовать объект класса Car по уровням, например. Внутренний и Общественный. Некоторые свойства на уровне Public не должны быть сериализованы, поскольку они являются внутренними.
На данный момент самый простой способ достичь этого - использовать наследование:
class CarPublic {
public int PropX {get;set}
}
class CarInternal: CarPublic {
public string PropY {get;set}
}
Тогда я мог
object ToSerialize() {
CarInternal car = GetCar();
if( level == Level.Public ) {
return car as CarPublic;
} else {
return car;
}
}
Результат ToSerialize () берется платформой (я не контролирую ее) и сериализуется в JSON или XML.
Я упустил атрибуты сериализации XML для простоты.
Это похоже на хак, и хаки ведут вас только так далеко. Есть ли лучший способ (способы?) Для достижения этого?
Я думаю, что это уже ясно, но я бы хотел избежать написания собственных методов сериализации для JSON и XML.
Заранее спасибо Tymek
== EDIT
Чтобы уточнить, я хочу иметь возможность сериализации нескольких уровней:
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}
}
а также
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;
}
== Выбранный подход
Я отметил ответ Марка Гравелла как ответ, поскольку он предоставляет общую информацию о том, как C # и его «стандартные» компоненты поддерживают то, что я просил.
Однако я думаю, что лучший подход к моей проблеме - использовать прокси-классы, как показано выше, и сериализовать класс в этом многоуровневом шаблоне с помощью методов, показанных ниже.
public interface ICar {
Car0 As0();
Car1 As1();
Car2 As2();
Car3 As3();
...
}
Это позволяет сохранитьCar0..3 классы очень простые, с только свойствами, чтобы поддерживать и понимать.