serialization - 如何使用 Google 协议缓冲区创建通用反序列化器?使用 C#
问题描述
我正在尝试使用 Google 协议缓冲区库在 C# 中进行序列化和反序列化过程。我可以使用以下代码反序列化NotificationSet.Parser.ParseJson(json);
,这工作正常。
NotificationSet 是 .proto 自动生成的文件。
但在这里你可以看到它不是通用的。因此,我需要以通用方式创建一个方法,而不是指定类型。你能就此提出建议吗?
例子:
public async Task<TResult> Deserialize<TResult, TValue>(TValue value)
{
TResult.Parser.ParseJson(value.ToString());
}
问题是 TResult 是泛型类型,因此无法从中获取 Parser 方法。
解决方案
找到了答案。
尝试使用 google 协议缓冲区库实现通用反序列化过程的代码。
public async Task<TResult> Deserialize<TResult,TValue>(TValue value)
{
try
{
System.Type type = typeof(TResult);
var typ = Assembly.GetExecutingAssembly().GetTypes().First(t => t.Name == type.Name);
var descriptor = (MessageDescriptor)typ.GetProperty("Descriptor", BindingFlags.Public | BindingFlags.Static).GetValue(null, null);
var response = descriptor.Parser.ParseJson(value.ToString());
return await Task.FromResult((TResult)response);
}
catch (Exception ex)
{
throw ex;
}
}
}
推荐阅读
- cuda - libcudart.so.9.0:无法打开共享对象文件:没有这样的文件或目录
- java - JRadioButton 未正确显示
- python - 在输入函数上未指定浮点值时如何分配公式?
- c++ - 如何使用归并排序计算大量输入的反转次数
- google-chrome - 提取 XPath 并在 google chrome 中运行
- vue.js - 从另一个模块提交突变
- python - 两只海龟碰撞时更新分数
- reactjs - create-react-app serve from nginx 错误加载资产
- single-sign-on - SAML SSO - SSO 如何与 SAML 配合使用
- swift - 使 SearchBar 快速检索准确的数据