Я использую protobuf-net для моей буферизации протокола. У меня есть dll, я загружаю динамически. Я могу создать экземпляр класса данных, содержащегося в DLL, и я могу использовать и модифицировать созданный объект данных. Однако, когда я пытаюсь сериализации/десериализации объекта данных я получаю следующее Крушения:десериализация протокольного буфера и динамически загружаемая DLL
{ "Не удалось определить известного типа для ProtoIncludeAttribute: MyDataDLL.MyDataClass, MyDataDLL, Version = 0.0.0.0, культура = нейтральной, 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 является четвертым в списке из 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.
Re «Любые дополнительные мысли?»; Я не видел ваше редактирование, пока вы не добавили комментарий; Я могу изменить тест, чтобы отразить обновление (когда я получу второй), но я не уверен, что IExtensible и т. Д. Повлияют на это. –
Я знаю, что прошло какое-то время, но мне удалось воспроизвести это. Дайте мне знать, если вы все еще интересуетесь исправить ... –
Да, определенно хочу знать, что исправить. Первоначальная задача была отброшена в сторону, но из общего интереса я хотел бы знать, в чем проблема. Кроме того, я вполне могу закончить его. –