Сериализация объекта в XML с использованием PropertyInfo [] в качестве отображения - PullRequest
1 голос
/ 25 января 2012

Я пытаюсь написать универсальный метод для сериализации объекта, который наследуется от моего интерфейса ITable.Я также хотел бы иметь параметр PropertyInfo [], где я могу указать свойства, которые должны быть сериализованы с объектом.Те, которых нет, игнорируются.Можно ли указать XmlSerialize сериализовать только перечисленные свойства?

Подпись метода:

public static string SerializeToXml<T>(T obj, PropertyInfo[] fields = null) where T : ITable

Если поля пустые, автоматически захватывать все поля.

if (fields == null)
{
    Type type = typeof(T);
    fields = type.GetProperties(BindingFlags.Public | BindingFlags.Instance);
}

Ответы [ 2 ]

1 голос
/ 25 января 2012

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

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

Итак, что-то вроде этого должно работать:

public static string SerializeToXml<T>(T obj, PropertyInfo[] fields = null)
    where T : ITable
{
    Type type = typeof(T);

    IEnumerable<PropertyInfo> ignoredProperties;

    if (fields == null)
        ignoredProperties = Enumerable.Empty<PropertyInfo>();
    else
        ignoredProperties = type.GetProperties(
            BindingFlags.Public | BindingFlags.Instance)
            .Except(fields);

    var ignoredAttrs = new XmlAttributes { XmlIgnore = true };

    var attrOverrides = new XmlAttributeOverrides();

    foreach (var ignoredProperty in ignoredProperties)
        attrOverrides.Add(type, ignoredProperty.Name, ignoredAttrs);

    var serializer = new XmlSerializer(type, attrOverrides);

    using (var writer = new StringWriter())
    {
        serializer.Serialize(writer, obj);
        return writer.ToString();
    }
}

На несвязанной ноте я думаю, что присвоение имени параметру, содержащему свойства fields, очень запутанно.

0 голосов
/ 25 января 2012

Для каждого поля объявите свойство, например:

public bool ShouldSerializeX()
{
    return X != 0;
}

Когда вы просматриваете поля, установите для его свойства значение true или false в зависимости от того, хотите ли вы его сериализовать или нет.

Так, например, если у вас есть поле Address, которого нет в PropertyInfo, задайте для свойства ShouldSerializeAddress значение false, и XmlSerializer должен его игнорировать.

Проверьте этот ответ для получения дополнительной информации .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...