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



我提供了一个库,用于序列化/反序列化与我合作的其他开发人员使用的数据。序列化的数据与类型名称一起存储在数据库中。我无法控制我的库使用哪些类型。我使用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是否可以反序列化数据。

如有任何帮助,我们将不胜感激。

下面的代码似乎起到了作用:

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

最新更新