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

Posted

技术标签:

【中文标题】在 protobuf-net 中,有没有办法指定在序列化/反序列化给定类型时要使用的自定义方法?【英文标题】:In protobuf-net, is there a way to specify a custom method to be used when serializing/deserializing a given type? 【发布时间】:2016-08-18 09:05:48 【问题描述】:

在protobuf-net(Marc Gravell 实现)中,有没有办法指定每次 protobuf 遇到要序列化的类型时使用的自定义 Serializer/Deserializer?

类似的东西:

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

我查看了文档,但找不到任何东西。 我知道这可以直接使用Protowriter 来序列化一个对象(比如这个DataTable 示例)。

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

【问题讨论】:

【参考方案1】:

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

RuntimeTypeModel.Default[typeof(Foo)].SetSurrogate(typeof(FooSurrogate));

库仍然控制FooSurrogate 在网络上的写入方式。目前还没有 API 可以让您直接控制类型的输出inside。但是如果你从ProtoWriter开始,你当然可以手动做所有事情。

【讨论】:

以上是关于在 protobuf-net 中,有没有办法指定在序列化/反序列化给定类型时要使用的自定义方法?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法在 protobuf-net 代理类中定义替代转换函数(从/到接口)

有没有办法将 IReadOnlyCollection<T>/IReadOnlyList<T> 与 protobuf-net 一起使用

交错 protobuf-net 和文件

如何在 xamarin ios pcl 中使用 protobuf-net

Protobuf-net 是不是有计划包括验证?

Protobuf-net 序列化错误 =“一旦生成了序列化程序,就无法更改类型”