Я использую protobuf-net для буферизации моего протокола. У меня есть dll, которую я загружаю динамически. Я могу создать экземпляр класса данных, содержащегося в dll, и я могу использовать и изменять созданный объект данных. Однако, когда я пытаюсь сериализовать/десериализовать объект данных, я получаю следующий сбой:
{"Невозможно определить известный тип для ProtoIncludeAttribute: MyDataDLL.MyDataClass, MyDataDLL, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"}
а иногда и сбой, говорящий, что MyDataClass не является подклассом MyBaseClass, или что-то в этом роде. MyDataClass определенно наследуется от MyBaseClass, а MyBaseClass имеет тег ProtoInclude для MyDataClass.
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 — 4-й в списке из 7 ProtoIncludes.
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.