Сложный вопрос XML-сериализации - PullRequest
0 голосов
/ 10 марта 2011

Итак, я пытаюсь создать определенный формат XML для потребителей создаваемого мной API.По сути, у вас будет такая модель:

public class SampleModel
{
     public ErrorCodeEnum ErrorCode { get; set; }
     public List<Error> LocalizedErrors { get; set; }
     public object AdditionalInformation { get; set; }
}

Теперь предположим, что у меня есть пример модели:

SampleModel model = new SampleModel()
model.ErrorCode = ErrorCodeEnum.InvalidParameters;
model.LocalizedErrors = new List<Error>
{
    new Error { For = "SomeField", Message = "Your SomeField value is unacceptable." },
    new Error { For = "SomeField2", Message = "Your SomeField2 value is unacceptable." },
};
model.AdditionalInformation = new SomeOtherType { SomeProperty = "Whatever" };

Я бы хотел убедиться, что сериализуется во что-товот так:

<xml>
<SampleModel>
   <ErrorCode>InvalidParameters</ErrorCode>
   <Errors>
       <Error For="Somefield">Your SomeField value is unacceptable.</Error>
       <Error For="Somefield2">Your SomeField2 value is unacceptable.</Error>
   </Errors>
   <SomeProperty>Whatever</SomeProperty>
</SampleModel>

Я решил довольно много этой проблемы, но остался один сторонник.По сути, сейчас все сериализуется так:

<xml>
<SampleModel>
   <ErrorCode>InvalidParameters</ErrorCode>
   <Errors>
       <Error For="Somefield">Your SomeField value is unacceptable.</Error>
       <Error For="Somefield2">Your SomeField2 value is unacceptable.</Error>
   </Errors>
   <AdditionalInformation>
       <SomeProperty>Whatever</SomeProperty>
   </AdditionalInformation>
</SampleModel>

По умолчанию XmlSerializer выводит имя свойства (в данном случае AdditionalInformation) вокруг сериализованных узлов его значения.Я пробовал несколько способов избавиться от этого узла.То, что я хотел бы видеть, - это в основном мой словарь значений, который нужно добавить на глубину 1 дочернего уровня корня XML и избавиться от AdditionalInformation.Поэтому, если бы у меня была такая модель:

SampleModel model = new SampleModel()
model.ErrorCode = ErrorCodeEnum.InvalidParameters;
model.LocalizedErrors = new List<Error>
{
    new Error { For = "SomeField", Message = "Your SomeField value is unacceptable." },
    new Error { For = "SomeField2", Message = "Your SomeField2 value is unacceptable." },
};
model.AdditionalInformation = new AThirdType { Foo = "Bar", Bing = "Baz" };

Я бы получил следующий XML:

<xml>
<SampleModel>
   <ErrorCode>InvalidParameters</ErrorCode>
   <Errors>
       <Error For="Somefield">Your SomeField value is unacceptable.</Error>
       <Error For="Somefield2">Your SomeField2 value is unacceptable.</Error>
   </Errors>
   <Foo>Bar</Foo>
   <Bing>Baz</Bing>
</SampleModel>

Возможно ли это, не пытаясь создать собственный XmlSerializer / Deserializer?

1 Ответ

3 голосов
/ 10 марта 2011

Боюсь, что это невозможно без реализации какого-либо пользовательского механизма сериализации (например, IXmlSerializable ), потому что представьте, что у вас есть этот XML, и вы хотите десериализовать его обратно в модель.Сериализатор не может знать, что эти свойства принадлежат сложному объекту.

Другая стратегия, которую вы можете адаптировать, - это просто создать класс модели представления, который будет адаптирован к желаемому результату XML, а затем использовать AutoMapper для сопоставления вашей модели с этой моделью представления.

Еще одна возможность - написать собственный механизм сериализации, используя непосредственно XDocument .

...