2012-01-19 3 views
4

Я предполагаю, что он смотрит на вашу модель и как-то готовит вещи, так что ваши первые несколько сериализации не замедляются. Что делать, если моя модель обмена сообщениями имеет класс сообщений с дочерними классами? Помещает ли мой родительский класс в аргумент типа также подготовить всех детей?Что делает подготовительный аппарат от protobuf-net?

+0

О, я хотел бы также отметить: если вы хотите абсолютный минимальный спин-вверх, вы можете предварительно собрать сериализаторы в сборку (DLL), и ссылка, что в вашем основном проекте ... –

ответ

6

(этот ответ предполагает Protobuf-сеть v2)

Если вы имеете в виду Serializer.PrepareSerializer<T>(), то это, безусловно, инспектировать все дочерние типы-, поэтому тип-модель будет готова для них (то есть: он будет выяснить, какие поля/свойства и т. д. требуется для сериализации). Он предварительно скомпилирует (то есть IL-emit) код для родительского класса, но (смотря на код), а не только на производные типы. При отсутствии ответов производные типы будут скомпилированы, когда это будет необходимо. Я думаю! Я могу сделать тщательную проверку, если вы действительно этого хотите.

Однако, если вы используете RuntimeTypeModel.Default.CompileInPlace(), он строит всю модель - все готово. Разумеется, после этого возникает вопрос о необходимости сначала рассказать модели о них; p

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


Update:

это выглядит, как он делает действительно каскадом производным типов, но не к типу родитель (если таковые имеются):

[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») были полностью скомпилированы. Так как базовый тип по-прежнему будет скомпилирован по требованию, это возможно штраф как есть, но я мог бы, вероятно, сделать его трактом для типов предков, если это было бы полезно.

(метод IsPrepared существует только в моей локальной копии)

+0

Мне было просто интересно, что он сделал. Моя программа не чувствительна к времени разворота. Спасибо, что вернулись ко мне так скоро. – Carlos

+1

@ Карлос это просто все возможное мышление, которое, возможно, потребуется сделать загодя; в противном случае он делает это как нужно (только в первый раз). –

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