Страницы

Поиск по вопросам

четверг, 9 апреля 2020 г.

Как исключить некоторые свойства при серилизации

#c_sharp #xml #serialize

                    
Я пытаюсь сериализовать объект с несколькими свойствами, но не хочу включать все
свойства при сериализации.

Конечно, я мог бы использовать атрибут [XmlIgnore], но мне необходима возможность
делать это динамически.

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

Заранее спасибо.
    


Ответы

Ответ 1



сделать это можно следующим образом. Воспользуемся готовым классом XmlAttributeOverrides но сделаем пару методов расширений для добавления строгой типизации: public static class XmlAttributeOverridesHelpers { public static void Add(this XmlAttributeOverrides overrides, Expression> propertySelector, XmlAttributes attributes) { overrides.Add(typeof(T), propertySelector.BuildString(), attributes); } public static string BuildString(this Expression propertySelector) { switch (propertySelector.NodeType) { case ExpressionType.Lambda: LambdaExpression lambdaExpression = (LambdaExpression)propertySelector; return BuildString(lambdaExpression.Body); case ExpressionType.Convert: case ExpressionType.Quote: UnaryExpression unaryExpression = (UnaryExpression)propertySelector; return BuildString(unaryExpression.Operand); case ExpressionType.MemberAccess: MemberExpression memberExpression = (MemberExpression)propertySelector; MemberInfo propertyInfo = memberExpression.Member; if (memberExpression.Expression is ParameterExpression) { return propertyInfo.Name; } else { // we've got a nested property (e.g. MyType.SomeProperty.SomeNestedProperty) return BuildString(memberExpression.Expression) + "." + propertyInfo.Name; } default: // drop out and throw break; } throw new InvalidOperationException("Expression must be a member expression: " + propertySelector.ToString()); } } применять можно следующим образом: var overrides = new XmlAttributeOverrides(); var ignore = new XmlAttributes { XmlIgnore = true }; overrides.Add(m => m.Id, ignore); overrides.Add(m => m.DateChanged, ignore); Type t = typeof(List); XmlSerializer serial = new XmlSerializer(t, overrides); Решение было найдено здесь

Ответ 2



Возможно Вам подойдет атрибут NonSerializedAttribute

Комментариев нет:

Отправить комментарий