在 protobuf-net 中,有没有办法指定在序列化/反序列化给定类型时要使用的自定义方法?

tig*_*rou 4 serialization protocol-buffers protobuf-net

protobuf-net(Marc Gravell 实现)中,有没有一种方法可以指定每次 protobuf 遇到要序列化的类型时使用的自定义序列化器/反序列化器?

类似的东西:

[ProtoContract]
class Foo 
{
    [ProtoMember(1), ProtoSerializer(BarSerializer)]
    public Bar Something { get; set; }
}

class BarSerializer
{
   public void Serialize(object value, Protowriter writer)
   {
       //do something here with writer...
   }
}
Run Code Online (Sandbox Code Playgroud)

我查看了文档,但找不到任何内容。我知道这可以Protowriter直接用于序列化对象(如这个DataTable示例)。

我想做的是仅对给定类型使用自定义序列化程序,并为已实现的其他类型使用默认实现(例如:int、string、...)

Mar*_*ell 6

不,基本上。但是您可以做的是编写用于序列化的第二种类型(代理类型)。此类型需要在两种类型之间具有转换运算符(在任一类型上声明,通常是代理),并注册到库中,例如:

RuntimeTypeModel.Default[typeof(Foo)].SetSurrogate(typeof(FooSurrogate));
Run Code Online (Sandbox Code Playgroud)

库仍然控制如何在线FooSurrogate上写入。当前没有允许您直接控制类型内部输出的 API 。但是,如果您从头开始,ProtoWriter您当然可以手动完成所有操作。