Думаю, вы правильно поняли. Вы захотите оставить старые поля вместе с их номерами без изменений, пока есть данные, хранящиеся в старом формате. Одна из замечательных особенностей буферов протокола заключается в том, что неустановленные поля по существу бесплатны, поэтому вы можете добавить столько новых полей, сколько хотите для облегчения миграции.
Я бы добавил новый набор float
и переименуйте поля double
, сохранив их номера полей:
message Matrix {
// Values in these fields should be transitioned to floats
double deprecated_width = 1;
double deprecated_height = 2;
repeated double deprecated_entries = 3;
float width = 4;
float height = 5;
repeated float entries = 6;
}
Каждый раз, когда вы читаете Matrix
из постоянного хранилища, перемещайте любые значения из устаревших полей в нерекомендуемые поля и записывайте обратно результат. Это должно способствовать постепенному переходу на плавающие объекты.
Я упомяну еще одну вещь, о которой вы, вероятно, уже знаете: буферы протокола не заботятся об именах полей. Для сериализации и десериализации имеют значение только номера полей. Это означает, что поля можно свободно переименовывать, если код, который ими управляет, также обновлен.
В какой-то момент в будущем, когда миграция будет завершена, удалите код миграции и удалите устаревшие поля, но зарезервируйте их поле числа:
message Matrix {
reserved 1, 2, 3;
float width = 4;
float height = 5;
repeated float entries = 6;
}
Это гарантирует, что любые случайные сообщения в старом формате взорвутся при десериализации вместо того, чтобы вызывать повреждение данных.
Надеюсь, это поможет!