(этот ответ предполагает protobuf-net v2)
Если вы имеете в виду Serializer.PrepareSerializer<T>()
, то он, безусловно, инспектирует все дочерние типы, поэтому будет подготовлена модель типовдля них (имеется в виду: он определит, какие поля / свойства и т. д. нуждаются в сериализации).Он будет предварительно скомпилировать (т.е. IL-emit) код для родительского класса, но (глядя на код) не специально для производных типов.Если они оставлены без присмотра, производные типы будут компилироваться самостоятельно при первой необходимости.Я думаю!Я могу сделать тщательную проверку, если вы действительно хотите.
Однако, если вы используете RuntimeTypeModel.Default.CompileInPlace()
, он строит всю модель - все известное готово.Конечно, тогда возникает дилемма о необходимости сначала рассказать о них модели: p
Я дважды проверю, чтобы увидеть, в какой момент подготовлены сериализаторы подтипов, просто чтобы быть уверенным.Может действительно иметь смысл каскадировать их.
Обновление:
похоже, что оно действительно каскадно относится к производным типам, но не к тип родителя (если есть):
[Test]
public void CheckTypeSpecificCompileInPlaceCascadesToBaseAndChildTypes()
{
var model = TypeModel.Create();
model[typeof(B)].CompileInPlace();
Assert.IsTrue(model.IsPrepared(typeof(D)), "D"); // sub-sub-type
Assert.IsTrue(model.IsPrepared(typeof(C)), "C"); // sub-type
Assert.IsTrue(model.IsPrepared(typeof(B)), "B"); // self
Assert.IsTrue(model.IsPrepared(typeof(A)), "A"); // base-type
}
[Test]
public void CheckGlobalCompileInPlaceCascadesToBaseAndChildTypes()
{
var model = TypeModel.Create();
model.Add(typeof (B), true); // give the model a clue!
model.CompileInPlace();
Assert.IsTrue(model.IsPrepared(typeof(D)), "D"); // sub-sub-type
Assert.IsTrue(model.IsPrepared(typeof(C)), "C"); // sub-type
Assert.IsTrue(model.IsPrepared(typeof(B)), "B"); // self
Assert.IsTrue(model.IsPrepared(typeof(A)), "A"); // base-type
}
Здесь проходит второй тест;первый тест не проходит со ссылкой на «A», поэтому подтипы («C» и «D») были полностью скомпилированы.Поскольку базовый тип будет по-прежнему компилироваться по требованию, это , вероятно, нормально, как есть, но я мог бы, вероятно, сделать так, чтобы он относился к типам предков, если это будет полезно.
(1029 * метод существует только в моей локальной копии)