Protobuf显式回调了回调

时间:2014-08-12 10:25:04

标签: c# protocol-buffers protobuf-net

是否可以显式调用[ProtoBeforeSerialization]之类的回调?来自其他任何课程? 我试图强制进行反序列化过程?

1 个答案:

答案 0 :(得分:0)

如果我们假设有回调,例如:

[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;
// ...