2017-01-26 5 views
0

Я надеюсь, что кто-то может проиллюстрировать общий прецедент для схем времени исполнения Microsoft Bond (SchemaDef). Я понимаю, что они используются, когда определения схемы неизвестны во время компиляции, но если форма объекта является текучей и часто изменяется, какие преимущества может обеспечить схема, созданная в режиме исполнения?Microsoft Bond runtime schemaDef

Моим вариантом использования является то, что бизнес-пользователь контролирует форму объекта (через механизм правил). Они могли бы делать всевозможные вещи, которые могли бы нарушить нашу обратную совместимость (например, инвертировать порядок полей на объекте). Если мы планируем сохранить все версии объектов, созданные пользователем, есть ли способ управлять совместимостью назад/вперед с использованием схем времени исполнения Bond? не я полагаю, нет, как если бы они инвертировать от этого:

0: int64 myInt; 
1: string myString; 

к этому

0: string myString; 
1: int64 myInt; 

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

Что могло бы быть причиной использования схемы выполнения во время работы?

Спасибо!

ответ

0

Некоторые используют для схем во время выполнения являются:

  • с простым двоичным протоколом для обработки схемы изменения
  • проверки схемы/evoluton
  • рендеринга структуры в графическом интерфейсе
  • пользовательских отображения из одна структура в другую

Ваше дело похоже на проверку схемы, если вы можете активно отклонить схему ma, которые не были бы совместимы. Я работал над системой, которая использовала Бонд под капотом и придерживалась такого подхода. Была явная операция «изменить схему этой сущности», которая подтвердила, совместимы ли две схемы друг с другом.

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

Простого Binary

При десериализации из простого Binary, читатель должен знать точной схему, что автор использовал, в противном случае он не имеет возможностей интерпретировать байты, что приводит к потенциально немому повреждению данных.

Такое повреждение может произойти, если схема претерпевает следующие изменения:

// starting struct 
struct Foo 
{ 
    0: uint8 f1; 
    1: uint16 f2; 
} 

Простой Binary упорядоченное представление Foo { f1: 1, f2: 2} является 0x01 0x02 0x00.

Давайте теперь изменить схему к этому:

// changed struct 
struct Foo 
{ 
    0: uint8 f1; 
    // It's OK to remove an optional field. 
    // 1: uint16 f2; 
    2: uint8 f3; 
    3: uint8 f4; 
} 

Если мы десериализации 0x01 0x02 0x00 с этой схемой, мы получим .Обратите внимание, что f3 равно 2, что неверно: оно должно быть 0. С помощью схемы времени выполнения для старого Foo читатель узнает, что второй и третий байты соответствуют полю, которое с тех пор было удалено и может пропустить их, в результате в ожидаемом Foo { f1:1, f3: 0, f4: 0 }.

Схема проверки и эволюция

Некоторые системы, использующие Bond имеют разные правила для эволюции схемы, что нормальные правила Bond. Схемы времени выполнения могут использоваться для обеспечения соблюдения таких правил (например, проверки типа для принудительного применения правила, которое не используется никакими коллекциями) до принятия структур определенного типа или до регистрации такой схемы, например, в хранилище известных схем.

Вы также можете пройти две схемы, чтобы определить, совместимы ли они друг с другом. Было бы неплохо, если бы Бонд предоставил такой API, так что его не нужно повторять повторно и снова. Я открыл GitHub issue for such an API.

GUI

С схемой выполнения, у вас есть дополнительная информация о структурах, в том числе таких вещей, как имена поле. (Бинарные протоколы кодирования опускают имена полей, полагаясь вместо этого на идентификаторы полей.) Вы можете использовать эту дополнительную информацию, чтобы делать такие вещи, как создавать элементы управления графическим интерфейсом, специфичные для каждого поля.

Есть пример, показывающий проверку схемы времени выполнения как в C#, так и в C++.

Пользовательского Mapping

В C++, то MapTo преобразования может быть использовано для преобразования одного-структуры в другую, что несовместимые формы, учитывая набор правил. Существует an example of this, который использует схему времени выполнения для получения правил.

Смежные вопросы