È possibile serializzare oggetti senza un costruttore senza parametri in WCF?
-
03-07-2019 - |
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.
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
- Sottoclasse il tipo in questione e passa i valori predefiniti appropriati al costruttore senza parametri
- 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?