为Protobuf-net.dll动态反序列化结果

时间:2013-03-28 09:27:16

标签: .net serialization silverlight-5.0 protobuf-net

我正在玩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 ParameterNameFieldbyte[] ParameterValueField。)

我想动态地反序列化结果,例如Serializer.Deserialize<int>(result);我已经将int传递给serialize,在这种情况下我知道我们需要在int类型中反序列化结果但是我想动态地反序列化我的结果序列

使用parameters[i].ParameterType.Name代码我得到了类名(例如System.Int32等)和用户defind数据类型,如Class1Class2等。如果我通过{{ 1}}在这种情况下,我收到以下错误:

  

无法将Serializer.Deserialize <parameters[i].GetType()> (result)应用于“operator '<'”和“method group”类型的操作数

System.Type是protobuf-net.dll中的一个类。在本课程中,Protobuf.SerializerSerialize<T>(System.IO.Stream)是两种序列化和反序列化结果的方法。

我不明白这是怎么回事!你能解释一下吗?

2 个答案:

答案 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是非泛型的。“ 这段代码是否需要额外的开销?