2009-02-24 2 views
2

Я использую 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.

+0

Re «Любые дополнительные мысли?»; Я не видел ваше редактирование, пока вы не добавили комментарий; Я могу изменить тест, чтобы отразить обновление (когда я получу второй), но я не уверен, что IExtensible и т. Д. Повлияют на это. –

+0

Я знаю, что прошло какое-то время, но мне удалось воспроизвести это. Дайте мне знать, если вы все еще интересуетесь исправить ... –

+0

Да, определенно хочу знать, что исправить. Первоначальная задача была отброшена в сторону, но из общего интереса я хотел бы знать, в чем проблема. Кроме того, я вполне могу закончить его. –

ответ

1

OK, изучай. Я зарегистрировал это here. Должно быть забавно ;-p Не заинтересованы, MyDataClass и MyBaseClass в той же сборке?

Кстати, в следующей капли, я намерен включить Serialize и т. д., которые принимают Type (а не generics) - это значительно упростит стек RPC «in progress» и поможет вам в использовании.


Обновление; Я добавил unit-test и (в отдельной DLL, загруженной через Assembly.LoadFromtest classes). Единичный тест прошел. Пожалуйста, вы можете уточнить, что ваш код делает по-другому (мне нужно что-то, что я могу воспроизвести, чтобы исправить его).

+0

Любые дополнительные мысли? –

Смежные вопросы