2010-02-16 8 views
4

У меня есть базовый класс в одной сборке и большое количество сгенерированных классов в другом, которые наследуются от базового класса. Использование protobuf-net (r282) для сериализации списка базового типа не удается при попытке разрешить subclassType (строка 248 SerializerT.cs), поскольку подкласс не находится в сборке базового класса. Перемещение классов вместе не является предпочтительным вариантом, и очень важно, чтобы я мог проходить List.protobuf-net [de] сериализация по границам сборки

Вот мой основной базовый класс. Включенные типы отмечены как ProtoMember(x).

[ProtoContract] 
[ProtoInclude(1,"SomeItemType")] 
[ProtoInclude(2,"AnotherItemType")] 
[ProtoInclude(190,"YetAnotherItemType")] 
public abstract class BaseItem 
{ 
} 

Как примечание стороны, это является частью оценки с использованием Protobuf-сети, чтобы заменить BinaryFormatter для перемещения данных между настольным приложением и SOAP веб-сервиса.

Могу ли я вообще что-то делать? Есть ли способ лучше? Я просто пропустил что-то очевидное? Отдельный долгосрочный вопрос заключается в том, должен ли я делать что-то немного другое, чтобы подготовиться к возможному переходу на 3.5?

ответ

1

Возможно, самый простой способ использовать ProtoInclude это с typeof, так как это будет обрабатывать много нюансов для вас автоматически:

[ProtoInclude(1, typeof(SomeItemType))] 

В качестве альтернативы вы можете просто использовать сборки квалифицированные имена, так:

[ProtoInclude(1,"SomeItemType, SomeRandomAssembly")] 

В довольно своеобразном случае с несколькими AppDomain с, я обнаружил, что вы также можете поработать с магией с событием AppDomain.TypeResolve, но этого следует избегать, если это возможно. У меня также есть полная переработка слоя метаданных в конвейере, что обеспечивает большую гибкость во время выполнения (вместо того, чтобы объявлять все когда-либо при компиляции, что вызывает некоторую боль выше).

+0

Спасибо Marc, именно то, что я искал. Использование полного имени, присвоенного сборке, сделало трюк. Поскольку мой SomeItemType недоступен в базовом классе, typeof (SomeItemType) не работает в этом случае. Еще раз спасибо. – tsupe

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