Решение, какие свойства сериализуются во время выполнения

Предположим, мне нужно сериализовать объект класса 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 классы очень простые, с только свойствами, чтобы поддерживать и понимать.

Ответы на вопрос(2)

Ваш ответ на вопрос