Domanda

So che un costruttore privato senza parametri funziona, ma che dire di un oggetto senza costruttori senza parametri?

Vorrei esporre i tipi da una libreria di terze parti, quindi non ho alcun controllo sulle definizioni dei tipi.

Se c'è un modo qual è il più semplice? Per esempio. Non ho bisogno di creare un sottotipo.

Modifica:

Quello che sto cercando è qualcosa di simile al livello di personalizzazione mostrato qui: http://msdn.microsoft.com/en-us/magazine/cc163902.aspx anche se non voglio ricorrere a flussi per serializzare / deserializzare.

È stato utile?

Soluzione

Non puoi davvero rendere serializzabili tipi arbitrari; in alcuni casi ( XmlSerializer , ad esempio) il runtime espone opzioni per falsificare gli attributi. Ma DataContractSerializer non lo consente. Opzioni possibili:

  • nascondi le classi dietro i tuoi tipi che sono serializzabili (molto lavoro)
  • fornisce surrogati di formattatori binari (yeuch)
  • scrivi il tuo core di serializzazione (molto lavoro per ottenere il giusto)

In sostanza, se qualcosa non è progettato per la serializzazione, pochissimo del framework ti permetterà di serializzarlo.

Altri suggerimenti

Non sono un esperto di WCF ma è improbabile che supportino la serializzazione su un costruttore con tipi arbitrari. Vale a dire perché cosa passerebbero per i valori? È possibile passare null per i tipi di riferimento e valori vuoti per le strutture. Ma a che serve un tipo che potrebbe essere costruito con dati completamente vuoti?

Penso che tu sia bloccato con 1 di 2 opzioni

  1. Sottoclasse il tipo in questione e passa i valori predefiniti appropriati al costruttore senza parametri
  2. Crea un tipo che esiste solo per la serializzazione. Una volta completato, può creare un'istanza del tipo originale che ti interessa. È una sorta di bridge.

Personalmente sceglierei il n. 2. Trasforma la classe in una struttura di soli dati e ottimizzala per scopi di serializzazione e di fabbrica.

Ho appena eseguito un piccolo test, utilizzando un servizio WCF che restituisce un oggetto di base che non ha un costruttore predefinito.

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

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

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

Ecco come appare il servizio:

public class MyService : IMyService
{
    #region IMyService Members

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

    #endregion
}

Funziona effettivamente, purché MyObject sia o [DataContract] o [Serializable]. È interessante notare che non sembra aver bisogno del costruttore predefinito sul lato client. C'è un post correlato qui:

In che modo la deserializzazione di WCF crea un'istanza di oggetti senza chiamare un costruttore?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top