在 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 一起使用