protobuf-net [de] сериализация через границы сборки - PullRequest
4 голосов
/ 16 февраля 2010

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

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

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

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

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

1 Ответ

1 голос
/ 17 февраля 2010

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

[ProtoInclude(1, typeof(SomeItemType))]

В качестве альтернативы вы можете просто использовать имена, соответствующие сборке,Итак:

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

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

...