Protobuff显式回调它的回调

本文关键字:回调 Protobuff | 更新日期: 2023-09-27 18:17:31

是否可以显式调用一个回调函数,如[ProtoBeforeSerialization] ?还有别的课吗?我要强制执行反序列化过程吗?

Protobuff显式回调它的回调

如果我们假设有如下回调:

[ProtoBeforeSerialization]
public void FixupStuffBeforeSerialization() {...}
[ProtoAfterSerialization]
public void FixupStuffAfterSerialization() {...}
[ProtoBeforeDeserialization]
public void FixupStuffBeforeDeserialization() {...}
[ProtoAfterDeserialization]
public void FixupStuffAfterDeserialization() {...}

则显式调用其中一个回调的过程为:显式调用其中一个回调。例如:

obj.FixupStuffBeforeDeserialization();

如果你有更微妙和细致入微的想法,请让我知道-最好提供一个具体的例子。如果情况是您只有object obj,并且不知道方法的名称-那么您将不得不通过反射来查找它们。为了与其他序列化器的兼容性和可比性,这是通过属性而不是接口来指定的。

但是像

var method = FindMethod<ProtoAfterDeserializationAttribute>(obj);
if(method != null) method.Invoke(obj, null);

:

static MethodInfo FindMethod<T>(object obj)
    where T : Attribute
{
    if(obj == null) return null;
    var methods = obj.GetType().GetMethods(
        BindingFlags.Public | BindingFlags.Instance);
    return methods.SingleOrDefault(m =>
        Attribute.IsDefined(m, typeof(T)) && m.GetParameters().Length == 0);
}

请注意,protobuf-net实际上支持这些方法的多重签名,包括带有上下文参数的签名——尽管这应该作为一个通用指南。


注意技术上选择回调的规则比上面建议的要复杂得多;如果您想知道protobuf-net将使用的实际方法,那么:询问type-model:

var callbacks = RuntimeTypeModel.Default[obj.GetType].Callbacks;
MethodInfo before = callbacks.BeforeDeserialize,
           after = callbacks.AfterDeserialize;
// ...