プロトコルのバッファリングに 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 パラメータを使用します。