Лучшая практика, чтобы сериализировать и десериализовать объекты .NET через версии

Я использовал следующий сервис загрузчика в нескольких приложениях, который работает, как я ожидал.

Loader Service

private loader;
constructor(private loaderCtrl: LoadingController) {
  this.loader = null;
}

async show(message?: string) {
  if (this.loader !== null) {
    this.loader.dismiss();
    this.loader = null;
  }

  this.loader = await this.loaderCtrl.create({
    spinner: 'crescent',
    message: message ? message : 'Please wait...',
  });
  return this.loader.present();
}

hide() {
  if (this.loader !== null) {
    this.loader.dismiss();
    this.loader = null;
  }
}

А вот скрипт для вызова API -

Компонент TS

try {
  await this.loaderSvc.show();
  this.service1.getData().subscribe((res) => {
  }, err => {
    throw "Error calling API";
  });
} catch (error) {
  console.log(error);
} finally {
  this.loaderSvc.hide();
}
5
задан huseyint 6 March 2009 в 15:08
поделиться

5 ответов

Это все зависит от Вашего приложения. Действительно ли это - распределенное большое приложение, где старые приложения могут встретиться с новыми объектами данных от центральной базы данных или другого источника? (Во многом как более старые версии офисных приложений должен иметь некоторые способы иметь дело с более новыми форматами документов.)

Если так, пользовательская сериализация и десериализация с явной нумерацией версии схемы, сказал бы я. Я поместил явные метаданные по каждому элементу и атрибуту, заявив, должен ли читатель понять элемент/атрибут (и значения по умолчанию если не). Это может, конечно, занимать довольно много места и увеличить сложность кода...

Но ответ действительно зависит от того, почему Вы сериализируете к базе данных. Вы не интересуетесь использованием базы данных для ее реляционного capabiities? Иначе O/R отображающееся решение мог бы представлять интерес.

1
ответ дан 14 December 2019 в 19:26
поделиться

Имейте номер версии схемы в сериализованном объекте. Используя пользовательскую десериализацию, проверьте атрибут версии сначала, и если это оказывается старой версией, обновите его до последней схемы перед десериализацией.

2
ответ дан 14 December 2019 в 19:26
поделиться

Посмотрите здесь этот разговор о лучших практиках на WCF datacontract управление версиями, это немного более конкретно, чем, что Вы действительно хотите, но эти шаблоны решают ту же проблему как Ваш, можно использовать их в любой технологии, которую Вы хотите.

2
ответ дан 14 December 2019 в 19:26
поделиться

Не удаляйте/переименовывайте свойства. Только добавьте их.

Присвойте значения по умолчанию всем свойствам.

Это гарантирует, что xml сериализатор сможет десериализовать старый xml в новый объект, и что объект будет иметь "нормальные" значения.

0
ответ дан 14 December 2019 в 19:26
поделиться

Что говорит Alex Reitbort.

Можно также реализовать интерфейс ISerializable для обработки старого значения

0
ответ дан 14 December 2019 в 19:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: