我正在玩C#protobuf实现,我可能遇到了问题。我想动态地反序列化结果。
public byte[] ManageRequest(string argument1, params FunctionalParameter[] argument2)
{
var serverBase = new ServerBase();
if (argument1 != null)
{
MethodInfo type = serverBase.GetType().GetMethod(argument1);
ParameterInfo[] parameters = type.GetParameters();
if (parameters.Length.Equals(argument2.Length))
{
var pars = new object[argument2.Length];
for (int i = 0; i < parameters.Length; i++)
{
if (parameters[i].Name == argument2[i].ParameterNameField)
{
using (Stream result = new MemoryStream(argument2[i].ParameterValueField))
{
pars[i] = Serializer.Deserialize<int>(result); // I want to deserialize the //result dynamically( not want to use int, we can pass result dynamically)
}
}
}
if (pars.Length.Equals(argument2.Length))
{
return type.Invoke(serverBase, pars).ToProtoBuf();
}
}
}
return null;
}
该方法有两个参数:
1. argument1
- MethodName
2. argument2
- FunctionalParameter
的数组(在这个类中我们有两个成员:
string ParameterNameField
和byte[] ParameterValueField
。)
我想动态地反序列化结果,例如Serializer.Deserialize<int>(result);
我已经将int传递给serialize,在这种情况下我知道我们需要在int类型中反序列化结果但是我想动态地反序列化我的结果序列
使用parameters[i].ParameterType.Name
代码我得到了类名(例如System.Int32
等)和用户defind数据类型,如Class1
,Class2
等。如果我通过{{ 1}}在这种情况下,我收到以下错误:
无法将
Serializer.Deserialize <parameters[i].GetType()> (result)
应用于“operator '<'
”和“method group
”类型的操作数
System.Type
是protobuf-net.dll中的一个类。在本课程中,Protobuf.Serializer
和Serialize<T>(System.IO.Stream)
是两种序列化和反序列化结果的方法。
我不明白这是怎么回事!你能解释一下吗?
答案 0 :(得分:4)
Serializer.Deserialize<T>(...)
API是通用的。但是,有一个非通用API ... Serializer.NonGeneric.Deserialize(...)
接受Type
。听起来你想要使用后一种API。
作为旁注:在v1。*版本中,主API是通用的;非通用API必须做一些额外的工作(并有一些额外的开销)。在v2。*版本中,核心代码库是非通用的。通用API没有额外的开销,因为它只能使用typeof(T)
等。
答案 1 :(得分:-2)
谢谢.. 使用这个,我得到了我想要的结果......我写了一些动态反序列化结果的代码 这是我的代码......
if (parameters[i].Name == argument2[i].ParameterNameField)
{
using (Stream result = new MemoryStream(argument2[i].ParameterValueField))
{
pars[i] = Serializer.NonGeneric.Deserialize(parameters[i].ParameterType, result);
}
}
parameters [i] .ParameterType - 获取参数的类型并反序列化。 再次感谢。 但是我根据你的答案感到困惑 “作为旁注:在v1。*版本中,主API是通用的;非通用API必须做一些额外的工作(并且有一些额外的开销)。在v2。*版本中,核心codebase是非泛型的。“ 这段代码是否需要额外的开销?