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;
}

このメソッドは 2 つの引数を取ります: 1. argument1- MethodName 2. argument2- s の配列FunctionalParameter(このクラスには 2 つのメンバーがあります: string ParameterNameFieldbyte[] ParameterValueField.)

結果を動的にデシリアライズしたい。たとえば、Serializer.Deserialize<int>(result);シリアライズに int を渡した。この場合、結果を int 型でデシリアライズする必要があることはわかっているが、シリアライズした結果を動的にデシリアライズしたい。

parameters[i].ParameterType.Nameコードを使用して、クラス名 (System.Int32など) とユーザー定義のデータ型( Class1、など) を取得しました。この場合Class2に渡すSerializer.Deserialize <parameters[i].GetType()> (result)と、次のエラーが発生しました。

タイプ ' ' および ' 'のoperator '<'オペランドには適用できませんmethod groupSystem.Type

Protobuf.Serializerprotobuf-net.dll のクラスです。このクラスでは、Serialize<T>(System.IO.Stream)Deserialize<T>(System.IO.Stream)は、結果をシリアライズおよびデシリアライズする 2 つのメソッドです。

これがどのように可能かわかりません!説明してもらえますか?

4

2 に答える 2

4

Serializer.Deserialize<T>(...)API は汎用です。ただし、非ジェネリック API があります...Serializer.NonGeneric.Deserialize(...)を受け入れるType. この後者の API を使用したいようです。

補足として、v1.* ビルドでは、プライマリ API は汎用です。非ジェネリック API は、追加の作業を行う必要がありました (そして、追加のオーバーヘッドがありました)。v2.* ビルドでは、コア コードベースは非汎用です。typeof(T)汎用 API には、 etcを使用できるため、これによる追加のオーバーヘッドはありません。

于 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 - パラメータの型を取得し、同じものを逆シリアル化します。再度、感謝します。しかし、私はあなたの回答に従って混乱して います。 * ビルド、コア コードベースは非ジェネリックです。" このコードは余分なオーバーヘッドがかかりますか?

于 2013-03-29T08:45:41.623 に答える