1

我正在玩 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- s 数组FunctionalParameter(在这个类中,我们有两个成员: string ParameterNameFieldbyte[] ParameterValueField。)

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

使用parameters[i].ParameterType.Name代码我得到了类名(例如System.Int32,等等)和用户定义的数据类型,比如Class1Class2等等。如果我Serializer.Deserialize <parameters[i].GetType()> (result)在这种情况下通过,我得到以下错误:

不能应用于“ ”和“ ”operator '<'类型的操作数method groupSystem.Type

Protobuf.Serializer是 protobuf-net.dll 中的一个类。在这个类中,Serialize<T>(System.IO.Stream)Deserialize<T>(System.IO.Stream)是序列化和反序列化结果的两种方法。

我不明白这怎么可能!你能给我解释一下吗?

4

2 回答 2

4

Serializer.Deserialize<T>(...)API 是通用的。但是,有一个非通用 API...Serializer.NonGeneric.Deserialize(...)接受Type. 听起来您想使用后一个 API。

附带说明:在 v1.* 构建中,主要 API 是通用的;非通用 API 必须做一些额外的工作(并且有一些额外的开销)。在 v2.* 构建中,核心代码库是非通用的。通用 API 没有额外的开销,因为它可以使用typeof(T)等。

于 2013-03-28T11:34:10.317 回答
-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. * 构建,核心代码库是非通用的。” 这段代码是否需要额外的开销?

于 2013-03-29T08:45:41.623 回答