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

Предположим, мне нужно сериализовать объект класса Car по уровням, например. Внутренний и общественный.Некоторые свойства на общедоступном уровне не следует сериализовать, поскольку они являются внутренними.

На данный момент «самый простой» способ, который я могу придумать для достижения этого, - использовать наследование:

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

8
задан tymtam 1 March 2012 в 03:27
поделиться