2

プロトコルのバッファリングに protobuf-net を使用しています。動的にロードしているdllがあります。dll に含まれるデータ クラスのインスタンスを作成し、作成したデータ オブジェクトを使用および変更できます。ただし、データ オブジェクトをシリアライズ/デシリアライズしようとすると、次のクラッシュが発生します。

{"ProtoIncludeAttribute の既知の型を識別できません: MyDataDLL.MyDataClass、MyDataDLL、Version=0.0.0.0、Culture=neutral、PublicKeyToken=null"}

また、MyDataClass が MyBaseClass のサブクラスではないなどのクラッシュが発生することもあります。MyDataClass は確実に MyBaseClass を継承し、 MyBaseClass には MyDataClass の ProtoInclude タグがあります。

Assembly theAssembly = Assembly.LoadFrom("MyDataDLL.dll");

Type theType = theAssembly.GetType("MyDataDLL.MyDataClass");

object theData = Activator.CreateInstance(theType);

using (FileStream theStream = File.Open(fileName, FileMode.OpenOrCreate))
{
    MethodInfo method = typeof(ProtoBuf.Serializer).GetMethod("Deserialize").MakeGenericMethod(theType);
    theData = method.Invoke(null, new object[] { theStream });                      
}

クラッシュは「method.invoke」で発生します

プロジェクトで dll を参照してそのように使用すると、クラッシュは発生しません。だから私はそれが動作しているdllであることを知っています。


更新: はい、MyDataClass と MyBaseClass は同じアセンブリにあります。

以下は、私のコードがあなたのテスト クラスと異なる動作をするリストです。おそらく広範囲ではありません: MyDataClass は、7 つの ProtoIncludes のリストの 4 番目です。

MyBaseClass にはすべてのデータ フィールドが含まれ、MyDataClass にはこれらのデータ フィールドを操作する関数のロジックが含まれます。したがって、MyDataClass には ProtoMember 呼び出しはありません。

MyBaseClass は IExtensible インターフェイスを実装し、追加データを処理する次の関数を備えています。

private ProtoBuf.IExtension extensionObject;
ProtoBuf.IExtension ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)            {
    return ProtoBuf.Extensible.GetExtensionObject(ref extensionObject, createIfMissing);
}

おそらく何の影響もありませんが、私の ProtoContracts は Name パラメータを使用します。

4

1 に答える 1

1

わかりました、調査します。私はこれをここに記録しました。楽しいはずです;-p興味がないので、MyDataClassMyBaseClassは同じアセンブリにありますか?

ところで; 次のドロップでは、(ジェネリックではなく) Serializea を受け入れる etc を含める予定ですType。これにより、「進行中」の RPC スタックがはるかに単純になり、使用法にも役立ちます。


アップデート; 単体テストを追加しました(別のdllで、Assembly.LoadFrom テストクラスを介してロードされます)。単体テストに合格しました。コードの違いを明確にしてください (修正するには、再現できるものが必要です)。

于 2009-02-24T20:38:58.330 に答える