需要在运行时确定哪些类型 protobuf-net 可以序列化/反序列化

Posted

技术标签:

【中文标题】需要在运行时确定哪些类型 protobuf-net 可以序列化/反序列化【英文标题】:Need to determine at run time which types protobuf-net can serialize/deserialize 【发布时间】:2021-11-26 05:05:18 【问题描述】:

我提供了一个库,用于对与我合作的其他开发人员使用的数据进行序列化/反序列化。序列化的数据与类型名称一起存储在数据库中。我无法控制我的库使用的类型。我使用 JSON 序列化,它适用于少量数据。但是当对象很大时,例如包含数千个项目的列表,它会很慢。

我希望我的库从 JSON 序列化切换到我在库中定义的特定类型的协议缓冲区,并根据 protobuf-net 要求进行装饰。

所以我需要写一个函数来判断一个类型是否可以序列化。我看到有一个 Serializer.NonGeneric.CanSerialize() 方法。但我需要一些适用于 List 等通用容器的东西。在我的数据库中,我的类型名称可能如下所示:

System.Collections.Generic.List`1[[MyAssembly.Person, MyAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=5.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e

...据此我需要确定 protobuf-net 是否可以反序列化数据。

任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

以下代码似乎可以解决问题:

public static bool CanSerialize(object obj)

    if (obj.GetType().IsGenericType)
    
        Type type = obj.GetType().GetTypeInfo().GenericTypeArguments[0];
        return Serializer.NonGeneric.CanSerialize(type);
    

    return Serializer.NonGeneric.CanSerialize(obj.GetType());

Marc Gravell 如果您正在阅读本文,似乎应该将此方法添加到 Serializer 类中。感谢这个伟大的图书馆。

【讨论】:

以上是关于需要在运行时确定哪些类型 protobuf-net 可以序列化/反序列化的主要内容,如果未能解决你的问题,请参考以下文章

<T> 在运行时 ProtoBuf-net 模型中是不是允许?

具有代理和继承层次结构的 protobuf-net v3

负载平衡系统中的 Protobuf-net 动态类型

protobuf-net 不适合哪些场景?

protobuf-net、版本控制和代理类型的最佳实践

如何在运行时确定设置的 oneof 字段的名称?