2009-03-30 3 views
2

, чтобы запутать код приложения, но все же использовать сериализацию для сохранения данных приложения, я хочу сопоставить имена всех сериализованных членов с пользовательскими именами сериализации. Я знаю, что могу добиться этого, внедряя ISerizableInterface, но в MSDN они предлагают использовать OnDeserializedAttribute, OnSerializingAttribute, OnSerializedAttribute и OnDeserializingAttribute для сериализации. Поэтому я хотел бы использовать OnSerializingAttribute для переименования моих членов. Проблема в том, что я не могу найти способ явно определить имена, под которыми член сериализуется.Использование .Net OnSerializingAttribute для изменения имен переменных?

Возможно ли явное определение имен для сериализации с помощью OnSerializingAttribute?

ответ

1

Я думаю, что пользовательская сериализация и интерфейс ISerializable будут наиболее эффективным способом в вашем случае. Проверьте образец here. Также here's хорошая дискуссионная нить в отношении обоих атрибутов ISERializable и сериализации, о которых вы упоминали.

Я бы сказал, что если вы хотите иметь полный контроль над форматом, вы должны использовать собственный сериализатор, и если вы хотите ответить на поток сериализации (de), то атрибуты являются наилучшим вариантом.

1

(редактировать: Я решил написать это вверх как blog entry, как я видел, что это будет полезно несколько раз)

Я имел пользователей перед использованием protobuf-net для этого; это использует плотный бинарный «протокол буферов протокола» Google, который не содержит никаких имен на проводе - просто цифры. Это означает, что:

  • имена не подвергаются на проводе
  • не имеет значения, является ли имя в классе во время выполнения «DateOfBirth» или «a1v»

это работает путем присвоения целочисленный тег для членов (свойств или полей) - например:

[ProtoMember(4)] 
public DateTime DateOfBirth {get;set;} 

только «4» используется в сериализации, но (главное) вам не нужно поддерживать много сериализации код. Также можно легко подключить к ISerializable, если вам нужно использовать удаленный доступ, а также есть WCF-крючок, если хотите.

Раскрытие: Я автор, так что я пристрастен - но инструмент свободен, так что вы ничего не теряете, имея взгляд ;-p

+0

Звучит, что protobuf-net - это правильный инструмент для работы, я дам ему пытаться. Хотя это, очевидно, нарушит совместимость с существующими файлами данных сериализации. – phatoni

1

Если вы используете .NET4 или .NET4.5 вы можете определить свой собственный DataContractResolver, чтобы переименовать атрибуты, но было бы проще просто использовать сжатый именованный в атрибуте

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