Protobuff显式回调它的回调
本文关键字:回调 Protobuff | 更新日期: 2023-09-27 18:17:31
是否可以显式调用一个回调函数,如[ProtoBeforeSerialization] ?还有别的课吗?我要强制执行反序列化过程吗?
如果我们假设有如下回调:
[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;
// ...