Как я могу сериализовать сторонний тип, используя protobuf-net или другие сериализаторы? - PullRequest
3 голосов
/ 24 октября 2011

У меня есть List<HtmlAgilityPack.HtmlNode>, но protobuf-net выдает ошибку, что у него нет контракта.Как мне указать договор на него, если у меня нет источника?Он фактически сказал, что не может определить тип, но я предполагаю, что это потому, что я не использовал его attibute, верно?

Бинарный сериализатор по умолчанию также жалуется, потому что тип не отмечен как сериализуемый.1005 * РЕДАКТИРОВАТЬ: сообщение об ошибке:

Type is not expected, and no contract can be inferred: HtmlAgilityPack.HtmlNode

Ответы [ 2 ]

5 голосов
/ 24 октября 2011

Честно говоря, в случае HTML я бы просто сохранил ... html - это своего рода предварительно сериализовано! Однако для ответа на вопрос:

В protobuf-net v2 вы можете настроить TypeModel во время выполнения, что позволяет делать все, что вы можете делать с помощью атрибутов и нескольких других приемов (в v2 атрибуты просто помогают управлять моделью, если ничего не указано). И поскольку вы можете делать все это во время выполнения, вам не нужно менять тип - и, следовательно, вы можете применять его к моделям вне вашего контроля. Экземпляр модели по умолчанию - RuntimeTypeModel.Default, и вы можете добавлять типы в модель и настраивать каждый MetaType индивидуально (который сопоставляется с типом). Это позволяет вам указать, какие элементы (свойства / поля), подтипы, обратные вызовы и т. Д. Применять.

Если это становится слишком сложным, вы также можете указать «суррогат», который позволяет настраивать простой DTO и использовать стандартный оператор преобразования (явный или неявный) для переключения между сложной моделью и простой моделью DTO.

Для информации, значение модели default по умолчанию: это то, что использует Serializer.*. Однако если вы используете экземпляр TypeModel для выполнения сериализации / десериализации, у вас может быть несколько по-разному настроенных моделей для одних и тех же типов.

Я не могу вспомнить полную информацию о пакете HTML-agility, но это основные параметры, доступные для вашего сценария через protobuf-net.

1 голос
/ 24 октября 2011

Для BSon вы можете указать свой собственный сериализатор для любого класса; см http://www.mongodb.org/display/DOCS/CSharp+Driver+Serialization+Tutorial#CSharpDriverSerializationTutorial-Writeacustomserializer

Вот пример , использующий его для сериализации динамических переменных C #.

...