【问题标题】:Deserialize the result dynamically for Protobuf-net.dll为 Protobuf-net.dll 动态反序列化结果
【发布时间】:2013-03-28 09:27:15
【问题描述】:

我正在使用 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 - 方法名 2. argument2 - FunctionalParameters 的数组(在这个类中,我们有两个成员: string ParameterNameFieldbyte[] ParameterValueField。)

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

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

不能将operator '&lt;' 应用于“method group”和“System.Type”类型的操作数

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      【解决方案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.* 构建中,核心代码库是非泛型的。” 这段代码是否需要额外的开销?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-10-15
        • 2012-04-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-04
        • 2019-08-05
        相关资源
        最近更新 更多