【问题标题】:Need to determine at run time which types protobuf-net can serialize/deserialize需要在运行时确定哪些类型 protobuf-net 可以序列化/反序列化
【发布时间】: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 是否可以反序列化数据。

任何帮助将不胜感激。

【问题讨论】:

    标签: 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 类中。感谢这个伟大的图书馆。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-27
      • 1970-01-01
      • 2012-04-26
      • 1970-01-01
      • 1970-01-01
      • 2010-10-15
      • 2013-01-29
      • 1970-01-01
      相关资源
      最近更新 更多