2011-11-21 17 views
5

Estoy intentando serializar/deserializar objetos que tienen miembros creados en fábrica. Por ejemplo, supongamos que hay un miembro del tipo Foo, que se crea una instancia utilizando FooFactory.CreateFoo (barra int).XmlSerializer y elementos creados en fábrica

Mi idea actual es

1.Create un XmlReader personalizado (por ejemplo, derivar de XMLTextReader), y adjuntar la fábrica para que

2.implement IXmlSerializable

3.in ReadXml(), Puedo agarrar la fábrica del lector.

No estoy seguro si esta es la forma más elegante de hacerlo, ¿alguien ha hecho intentos similares?

Respuesta

5

XmlSerializer simplemente no está configurado para eso. Le sugiero encarecidamente que si desea utilizar XmlSerializer, su mejor opción sería mapear sus datos a un modelo de DTO más simple primero, y serializar que. Cuando vuelva a escribir el código del DTO en su modelo, agregue la creación de fábrica allí, en código normal. El modelo de DTO debe ser simple; lo suficientemente simple para XmlSerializer para estar contento con él.

Sí, la implementación de IXmlSerializable es una opción , sin embargo: la API es muy difícil conseguir% derecha 100 (para manejar todas las diversas formas XML pueden aparecer a ella). Encuentro esa API muy difícil, y hago mucha serialización. Siento humildemente que escribir unas líneas de código para mapear desde su modelo principal a un modelo DTO es mucho más robusto (y mucho más rápido) que tratar de implementar IXmlSerializable.

Por ejemplo, usted podría tener:

[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; } 
    } 
} 

entonces se puede convertir de Foo a FooDTO simplemente por:

Foo foo = ... 
FooDTO dto = foo; 
+0

Gracias, DTO parece ser el camino a seguir aquí! :) – Oyvind

Cuestiones relacionadas