Страницы

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

вторник, 25 июня 2019 г.

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

Я пытаюсь сериализовать объект с несколькими свойствами, но не хочу включать все свойства при сериализации.
Конечно, я мог бы использовать атрибут [XmlIgnore], но мне необходима возможность делать это динамически.
Вопрос заключается в следующем как исключить некоторые свойства при серилизации не изменяя исходного класса, при это хотелось бы иметь строгую типизацию.
Заранее спасибо.


Ответ

сделать это можно следующим образом.
Воспользуемся готовым классом 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);
Решение было найдено здесь

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

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