Pregunta

Sé que un constructor privado sin parámetros funciona, pero ¿qué pasa con un objeto sin constructores sin parámetros?

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

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

Editar:

Lo que estoy buscando es algo 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 flujos para serializar / deserializar.

¿Fue útil?

Solución

Realmente no puedes hacer que los tipos arbitrarios sean serializables; en algunos casos ( XmlSerializer , por ejemplo) el tiempo de ejecución expone las opciones para falsificar los atributos. Pero DataContractSerializer no permite esto. Opciones factibles:

  • oculte las clases detrás de sus propios tipos que son serializables (mucho trabajo)
  • proporcionar sustitutos de formateador binario (yeuch)
  • escriba su propio núcleo de serialización (mucho trabajo para hacer bien)

Esencialmente, si algo no está diseñado para la serialización, muy poco del marco le permitirá que lo serialice

Otros consejos

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

Creo que estás atrapado con 1 de 2 opciones

  1. Subclasifique el tipo en cuestión y pase los valores predeterminados apropiados al constructor sin parámetros
  2. Cree un tipo que exista únicamente para la serialización. Una vez completado, puede crear una instancia del tipo original en el que esté interesado. Es una especie de puente.

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

Acabo de realizar 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; }
}

Aquí es cómo se ve el servicio:

public class MyService : IMyService
{
    #region IMyService Members

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

    #endregion
}

Esto realmente funciona, siempre y cuando MyObject sea un [DataContract] o [Serializable]. Curiosamente, no parece necesitar el constructor predeterminado en el lado del cliente. Hay una publicación relacionada aquí:

¿Cómo la deserialización de WCF crea una instancia de los objetos sin llamar a un constructor?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top