需要在运行时确定哪些类型 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 可以序列化/反序列化的主要内容,如果未能解决你的问题,请参考以下文章