Что делает prepareserializer от protobuf-net? - PullRequest
4 голосов
/ 20 января 2012

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

1 Ответ

6 голосов
/ 20 января 2012

(этот ответ предполагает 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 * метод существует только в моей локальной копии)

...