是否可以显式调用[ProtoBeforeSerialization]之类的回调?来自其他任何课程? 我试图强制进行反序列化过程?
答案 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;
// ...