[ProtoInclude]
работает от базового класса до подкласса - вам нужно аннотировать тип base - так: Pet
, что необходимо для объявления [ProtoInclude(...)]
маркеров для Cat
и Dog
. Точно так же Creature
должен будет объявить, что ожидает Animal
. Очевидно, это проблема, если вы не управляете Creature
, но этот можно настроить через RuntimeTypeModel
во время выполнения, если это проблема. Лично я бы не рекомендовал использовать тип, которым вы не управляете в иерархии сериализации.
Но на ваши вопросы:
- это не имеет значения, если только оно не конфликтует с другими числами объявленного типа; ниже - дешевле (
12
дешевле кодировать, чем 34134923
)
- полностью зависит от вас; не имеет значения, чередуются ли обычные поля и поля подтипов, поэтому наличие
[ProtoInclude(4, Whatever)]
[ProtoInclude(7, WhateverElse)]
class Foo {
[ProtoMember(1, ...)] ...
[ProtoMember(2, ...)] ...
[ProtoMember(3, ...)] ...
[ProtoMember(5, ...)] ...
[ProtoMember(6, ...)] ...
[ProtoMember(8, ...)] ...
}
но я признаю, что многие люди предпочитают разделять 2 - возможно,
[ProtoInclude(101, Whatever)]
[ProtoInclude(102, WhateverElse)]
class Foo {
[ProtoMember(1, ...)] ...
[ProtoMember(2, ...)] ...
[ProtoMember(3, ...)] ...
[ProtoMember(4, ...)] ...
[ProtoMember(5, ...)] ...
[ProtoMember(6, ...)] ...
}