2009-02-10 14 views
6

¿Es de alguna manera posible utilizar el XmlSerializer para deserializar sus datos en una instancia existente de una clase en lugar de en una nueva?¿Cómo usar XmlSerializer para deserializar en una instancia existente?

Esto sería útil en dos casos:

  1. fácilmente fusionar dos archivos XML en una instancia de objeto.
  2. Deje que sea el propio constructor de objetos el que cargue sus datos del archivo XML.

Si el no es posible por defecto debería funcionar mediante el uso de la reflexión (la copia de cada propiedad después de la deserialización) pero esto sería una solución fea.

Respuesta

1

Creo que estás en el camino correcto con la idea de reflexión.

Dado que es probable que tenga una envoltura alrededor de las operaciones XML de todos modos, se puede tomar en el objeto de destino, haga lo deserialización normalmente en un nuevo objeto, a continuación, hacer algo similar a la clonación copiando uno por uno sólo las propiedades que llevan a cabo sin -valores predeterminados.

No debería ser tan complejo implementar esto, y los consumidores verían desde el resto de su aplicación al igual que la deserialización in situ.

4

Básicamente, no se puede. XmlSerializer es estrictamente constructivo. Lo único interesante que puede hacer para personalizar XmlSerializer es implementar IXmlSerializable y hacer todo usted mismo, no es una opción atractiva (y aún creará instancias nuevas con el constructor predeterminado, etc.).

¿Es xml un requisito estricto? Si puede utilizar un formato diferente, protobuf-net soportes fusión de fragmentos en las instancias existentes, la manera más simple:

Serializer.Merge(source, obj); 
0

Me encontré con el mismo problema hace unas semanas.

Puse un método Deserialize (cadena de forma serializada) en la interfaz de ISelfSerializable que implementó una clase de entidad de mina. También me aseguré de que la interfaz obligara a la clase a tener un constructor predeterminado.

En mi fábrica creé un objeto de ese tipo y luego deserialicé la cuerda en él.

0

Esto no es hilo cosa segura a hacer ... pero se puede hacer:

[Serializable] 
public class c_Settings 
{ 
    static c_Settings Default; 
    public static SetExistingObject(c_Settings def) 
    { 
     Default = def; 
    } 

    public string Prop1; 
    public bool Prop2; 

    public c_Settings() 
    { 
     if (Default == null) 
      return; 
     MemberInfo[] members = FormatterServices.GetSerializableMembers(typeof(c_Settings)); 
     FormatterServices.PopulateObjectMembers(this, members, FormatterServices.GetObjectData(Default, members)); 
    } 
} 

De esta manera usted alimenta a su objeto a deserialiser y deserialiser sólo se sobrescribe todo lo que está escrito en .xml.

Cuestiones relacionadas