XmlSerializer
просто не настроен для этого. Я настоятельно рекомендую, чтобы, если вы хотите использовать XmlSerializer
, лучше всего было бы сопоставить ваши данные с более простой моделью DTO first и сериализовать , что . При записи кода обратно из DTO в вашу модель добавьте фабричное создание туда в обычном коде. Модель DTO должна быть простой; достаточно просто для XmlSerializer
чтобы быть счастливым.
Да, реализация IXmlSerializable
является опцией , однако: этот API очень трудно получить на 100% правильно (чтобы справиться со всеми различными способами, которыми может казаться XML) , Я нахожу этот API очень сложным, и я делаю много сериализации. Я смиренно утверждаю, что написание нескольких строк кода для сопоставления вашей модели main с моделью DTO намного надежнее (и намного быстрее), чем попытка реализовать IXmlSerializable
.
Например, вы могли бы иметь:
[XmlRoot("foo")]
public class FooDTO {
[XmlAttribute("bar")]
public int Bar {get;set;}
public static implicit operator Foo(FooDTO value)
{
return value == null ? null : FooFactory.Create(value.Bar);
}
public static implicit operator FooDTO(Foo value)
{
return value == null ? null : new FooDTO { Bar = value.Bar; }
}
}
затем вы можете конвертировать из Foo
в FooDTO
просто:
Foo foo = ...
FooDTO dto = foo;