我认为它会查看您的模型,并以某种方式使事情准备就绪,因此您的前几个序列化不会减慢。如果我的消息传递模型有一个带有子类的消息类怎么办?将我的父类放在类型参数中也会为所有孩子做好准备吗?
答案 0 :(得分:6)
(这个答案假定为protobuf-net v2)
如果你的意思是Serializer.PrepareSerializer<T>()
,那么它肯定会检查所有的子类型,所以类型模型将为它们做好准备(意思是:它会找出哪些字段/属性等需要序列化)。它将预编译(即IL-emit) parent 类的代码,但(查看代码)不是专门针对派生类型的。如果无人参与,派生类型将在首次需要时自行编译。我认为!如果你真的想要,我可以做一个彻底的检查。
但是,如果您使用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”)已完全编译。由于基类型仍然可以根据需要进行编译,因此可能很好,但如果有用的话,我可能会让它成为祖先类型。
(IsPrepared
方法仅存在于我的本地副本中)