Использование .Net OnSerializingAttribute для изменения имен переменных? - PullRequest
2 голосов
/ 30 марта 2009

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

Можно ли явно определить имена для сериализации, используя атрибут OnSerializingAttribute?

Ответы [ 3 ]

1 голос
/ 30 марта 2009

( edit : я решил написать это как запись в блоге , поскольку я видел, что это было полезно несколько раз)

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

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

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

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

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

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

1 голос
/ 29 мая 2012

Если вы используете .NET4 или .NET4.5, вы можете определить свой собственный DataContractResolver для переименования атрибутов, но было бы проще просто использовать сжатое имя в атрибуте [DataMember(...)]

1 голос
/ 30 марта 2009

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

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

...