2009-03-03 20 views
6

Sé que un constructor privado sin parámetros funciona, pero ¿qué pasa con un objeto sin constructores sin parámetros?¿Es posible serializar objetos sin un constructor sin parámetros en WCF?

Me gustaría exponer tipos de una biblioteca de terceros, por lo que no tengo control sobre las definiciones de tipo.

Si hay una forma, ¿cuál es la más fácil? P.ej. No sé qué tener que crear un subtipo.

Editar:

Lo que estoy buscando es algo así como el nivel de personalización que se muestra aquí: http://msdn.microsoft.com/en-us/magazine/cc163902.aspx aunque no quiero tener que recurrir a los arroyos para serializar/deserializar.

Respuesta

5

Realmente no se puede hacer serializable tipos arbitrarios; en algunos casos (XmlSerializer, por ejemplo), el tiempo de ejecución expone las opciones para suplantar los atributos. Pero DataContractSerializer no permite esto.opciones viables:

  • esconden las clases detrás de sus propios tipos que son serializables (mucho trabajo)
  • proporcionan sustitutos formateador binario (yeuch)
  • escribir su propio núcleo de serialización (un montón de trabajo a conseguir la derecha)

en esencia, si algo no está diseñado para la serialización, muy poco del marco se dejar que lo serializas.

+0

Es una pena, me gustaría algo así como los métodos de extensión donde el marco busca un método de extensión en el objeto y, si existe, lo llama a serializar/deserializar. –

+1

El marco no puede realmente buscar métodos de extensión; son un truco de compilación. Si existiera el múltiplo, ¿cuál elegiría? Lo que describes está cerca de los sustitutos, pero eso todavía es mucho trabajo. –

+0

Sí, supongo que tendría que registrar su implementación de alguna manera. Hay tantos ganchos en WCF si solo hubiera uno para la serialización que fuera simple y poderoso (es decir, no necesitara poseer los tipos que se serializan). –

1

No soy un experto en WCF pero es poco probable que admitan la serialización en un constructor con tipos arbitrarios. A saber, ¿qué pasarían por valores? Podría pasar nulo para los tipos de referencia y los valores vacíos para las estructuras. Pero, ¿de qué serviría un tipo que podría construirse con datos completamente vacíos?

Creo que hay que contentarse con 1 de 2 opciones

  1. Sub clase del tipo en cuestión y pasar valores por defecto correspondientes al constructor sin parámetros no
  2. Crear un tipo que existe Soley para la serialización. Una vez completado, puede crear una instancia del tipo original que le interese. Es una especie de puente.

Personalmente iría por el n. ° 2. Convierta la clase en una estructura solo de datos y optimícela para la serialización y para fines de fábrica.

+0

El problema con esto es que hay muchos tipos en la biblioteca y tendré que mapear todos los tipos a través de lo cual estoy haciendo ahora con un subconjunto de los tipos en la biblioteca de terceros. –

1

Acabo de ejecutar una pequeña prueba, utilizando un servicio WCF que devuelve un objeto básico que no tiene un constructor predeterminado.

//[DataContract] 
//[Serializable] 
public class MyObject 
{ 
    public MyObject(string _name) 
    { 
     Name = _name; 
    } 

    //[DataMember] 
    public string Name { get; set; } 

    //[DataMember] 
    public string Address { get; set; } 
} 

Esto es lo que ve el servicio como:

public class MyService : IMyService 
{ 
    #region IMyService Members 

    public MyObject GetByName(string _name) 
    { 
     return new MyObject(_name) { Address = "Test Address" }; 
    } 

    #endregion 
} 

Esto funciona en realidad, siempre y cuando MiObjeto es o bien un [DataContract] o [Serializable]. Curiosamente, no parece necesitar el constructor predeterminado en el lado del cliente. Hay un post relacionado aquí:

How does WCF deserialization instantiate objects without calling a constructor?

+0

Lamentablemente, los tipos de marcos de terceros no están marcados como [DataContract] o [Serializable]. –

+0

Esto significa que no fueron diseñados para ser serializados, así que no los serialice. –

+1

Es posible que pueda escribir un objeto adaptador serializable que ajuste los tipos de terceros y solo serialice las piezas que necesita. –

Cuestiones relacionadas