Совместное использование набора полей, украшенных XmlElementAttribute, между типами - PullRequest
1 голос
/ 30 ноября 2011

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

public class RequestHeader
{
    [XmlElement]
    public string UserId { get; set; }

    [XmlElement]
    public string RequestId { get; set; }
}

[XmlRoot]
public class RequestType
{
    public RequestHeader Header { get; set; }

    // ... other fields ...
}

[XmlRoot]
public class AnotherRequestType
{
    public RequestHeader Header { get; set; }

    // ... other fields ...
}

При сериализации любого из этих типовсериализатор заключает содержимое свойства Header в элемент * <Header>.Есть ли атрибут, который может украшать свойство Header так, что родительский элемент <Header> не отображается?Я успешно выполнил это при сериализации свойств коллекции, но я не был уверен, можно ли это сделать с одним элементом.

<RequestHeader>
    <Header>                         <!-- omit this -->
        <UserId>user</UserId>
        <RequestId>123</RequestId>
    </Header>                        <!-- omit this -->
</RequestHeader>

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

Ответы [ 2 ]

0 голосов
/ 09 августа 2012

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

0 голосов
/ 30 ноября 2011

Я бы сказал, что вы реализуете IXmlSerializable в RequestHeader классе и пишете атрибуты, используя Writer вручную, не заключая их в какой-либо внешний тег.

...